13

インライン関数の場合、次のような制約を作成できます。

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

引数に特定の演算子またはメンバーが必要です。似たようなものに基づいて一致させる方法はありますか?

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

4

2 に答える 2

30

インラインのアクティブパターンも作成できるようです。これまで使ったことがないのですが、今使ってみたところ、問題なく動作しているようです。以下のパターンは、以下を返すメソッドをTest実装する任意のオブジェクトで使用できます。Testoption< ^R >

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"

パターンマッチングがオブジェクトの一部になっているため、これは非常に興味深い手法のように見えます。

于 2011-09-03T11:53:23.373 に答える
0

リフレクションを使用する必要があると思います。たとえば、のメンバーo:objを取得してリフレクトする関数があります。o.GetType()

于 2011-09-03T11:52:32.987 に答える