FSharp活动模式出现问题

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)

有人可以帮忙解释一下我应该在这里做什么吗?

2
你的第一个模式是期望2个还是3个参数?我认为你想要2个,但现在你得到了两个命名的和一个隐含的(由于function表达式)。 - Ramon Snir
我刚刚发现了函数中的隐式参数。如果您想回答并展示,我会将其标记为正确答案。 - bradgonesurfing
1个回答

3
题目是这样的,function不仅匹配最后一个参数,还会添加一个额外的参数(functionfunmatch 的组合)。在第一个模式中移除函数参数 input,就能解决问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接