2011-09-03 2 views
12

。同様のものに基づいて一致させる方法はありますか?アクティブパターンと部材制約

上記のようにインライン関数の制約に一致するメソッドに渡される引数が、その関数をトリガし、その他すべてがエラー管理の一部として終了するアクティブなパターンを作成したいとします。

答えて

28

インラインアクティブパターンも作成できるようです。私はこれまでこれを使用していませんでしたが、今試しましたが、うまくいくようです。今、あなたはTestメソッドを定義するいくつかのオブジェクトを定義し、パターン使用してそれらを一致させることができます

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

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

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

これを以下Testパターンがoption<^R>を返すTest方法を実装する任意のオブジェクトで使用することができますパターンマッチングはオブジェクトの一部になっているので、非常に興味深いテクニックのように見えます。

0

あなたは反射を使用する必要があると思います。 o:objを受け取ってからo.GetType()のメンバーに反映させる関数があります。