2013-03-12 24 views
3

我解析了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 

的目的是有一個通用的二元函數匹配,返回「」左'和'右',然後創建專門的二進制的匹配,如多,分水嶺並添加和減去。

不過,我在第二圖案得到一個錯誤

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'表達式)。 – 2013-03-12 20:30:47

+0

我剛剛通過函數發現了隱式參數。如果你想做出答案,表明我將其標記爲正確。 – bradgonesurfing 2013-03-12 20:33:41

回答

3

的這裏的問題是,function不只有最後一個參數模式匹配,而且還增加了一個額外的參數(functionfunmatch之間的組合)。從第一個模式中刪除函數參數input,並解決您的問題。