2011-09-03 41 views
12

對於內聯函數一個可以創建一個約束,如:活動模式和成員約束

let inline implicit arg = 
    (^a : (static member op_Implicit : ^b -> ^a) arg) 

需要的參數給定的運營商或成員。有沒有一種方法可以基於類似的東西進行匹配?

我想創建一個活躍的格局,其中則傳遞給內聯函數如上述的約束相匹配的方法,任何參數觸發功能和一切爲一些錯誤管理的一部分結束。

回答

28

看起來你可以編寫內聯活動模式了。我以前沒有使用過,但現在我嘗試了它,它似乎工作得很好。

let inline (|Test|_|) (a:^T) : option<^R> = 
    (^T : (member Test : unit -> option<^R>) a) 

現在,您可以定義定義Test方法的一些對象,並使用模式匹配他們:

type A() = 
    member x.Test() = Some(10) 

match new A() with 
| Test(n) -> printfn "%d" n 
| _ -> printfn "failed" 

這將Test模式下面可以實現Test方法,返回option<^R>任何對象使用看起來像一個非常有趣的技術,因爲模式匹配現在是對象的一部分。

0

我認爲你必須使用反射,如有一個函數,它o:obj,然後反映了o.GetType()的成員。