Проблема с активными моделями 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 с первого паттерна, и ваша проблема будет решена.

Другие вопросы по тегам