Проблема с активными моделями FSharp
Я анализирую цитаты из кода в FSharp и создаю шаблонные помощники. Все шло хорошо, пока я не попробовал
let (|BinaryFn|_|) fn (input:Expr) =
function
| SpecificCall fn (_,_,l::r::[]) -> Some(l,r)
| _ -> None
let (|Multiply|_|) x =
function
| BinaryFn <@ (*) @> (l,r) -> Some(l,r)
| _ -> None
Намерение состоит в том, чтобы иметь общий двоичный сопоставитель функций, который возвращает "левый" и "правый", а затем создавать специализированные двоичные сопоставители, такие как Multiple, Divide и Add и Subtract.
Однако я получаю ошибку на втором шаблоне, который
Error FS0001: Type mismatch. Expecting a
'a -> 'b option
but given a
'a -> 'c -> (Expr * Expr) option
The type ''a option' does not match the type
''b -> (Expr * Expr) option' (FS0001) (Shambolics)
Может кто-нибудь просветить меня, что мне здесь делать?
1 ответ
Решение
Проблема здесь в том, что function
не только соответствует шаблону последнего аргумента, но также добавляет дополнительный аргумент (function
это сочетание между fun
а также match
). Удалить аргумент функции input
с первого паттерна, и ваша проблема будет решена.