Проблема с активными шаблонами 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 and 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)

Может кто-нибудь, пожалуйста, просветите меня о том, что я должен делать здесь?


person bradgonesurfing    schedule 12.03.2013    source источник
comment
Ваш первый шаблон ожидает 2 или 3 аргумента? Я думаю, вы имели в виду 2, но теперь вы получаете два именованных и один неявный (по выражению function).   -  person Ramon Snir    schedule 13.03.2013
comment
Я только что обнаружил неявный параметр функции. Если вы хотите сделать ответ, показывающий, что я отмечу его как правильный.   -  person bradgonesurfing    schedule 13.03.2013


Ответы (1)


Проблема здесь в том, что function не только соответствует образцу последнего аргумента, но также добавляет дополнительный аргумент (function — это комбинация fun и match). Удалите аргумент функции input из первого шаблона, и ваша проблема будет решена.

person Ramon Snir    schedule 12.03.2013