3

我正在解析 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 

目的是有一个通用的二进制函数匹配器,它返回“左”和“右”,然后创建专门的二进制匹配器,例如多重、除法和加减法。

但是我在第二种模式上遇到错误

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)

有人可以告诉我我应该在这里做什么吗?

4

1 回答 1

3

这里的问题是function不仅模式匹配最后一个参数,而且还添加了一个额外的参数(是 of和function之间的组合)。从第一个模式中删除函数参数,您的问题将得到解决。funmatchinput

于 2013-03-12T20:47:24.747 回答