2017-02-09 7 views
3

私はジーンBelitskiによって優秀な本F# Design Patternsでこのコードを見つけました:著者はこれがアクティブパターンがこのように動作するのはなぜですか?

「あなたはの結合を聞かせていることを覚えていれば明らかになり、わずかに遠くなるような気例であることを認識し

let (| `` I'm active pattern `` |) x = x + 2 
let (`` I'm active pattern `` y) = 40 
(* 
val (|`` I'm active pattern ``|) : x:int -> int 
val y : int = 42 
*) 

値は、データを逆アセンブルするパターンマッチングのコーナーケースです。したがって、I'm active patternが入力引数40に適用され、結果42がxにバインドされます。

私はそれを取得しません。 40が右側にあるので、I'm active patternが40に適用されるのはなぜですか?直感的に私は暗黙の関数として式let (`` I'm active pattern `` y) = 40を見て、42ではなくy = 38と推測します。

誰でも説明できますか?

+2

例OPでいくつかの出力への入力(例えば、Date to DateTimeなどの文字列)。 letはパターンマッチングであるため、このタイプの動作を取得します。これは、「let」でDUを分解するのと同様です。例えば。 'let(Foo x)= foo'はFoo DUにラップされた値を取り出します。 – s952163

答えて

7

これがアクティブパターンを特別なものにする理由です。通常の機能では、定義let f x = ...fのアプリケーションを反映しています。f eeの代わりにxに置き換えて精神的に評価することができます。これとは対照的に

は、アクティブパターンlet (|P|) x = ...で、あなたがlet (P y) = eを見ると新鮮な識別子yeに定義の本体を適用した結果を取得します。

これはおそらく、結果タイプは、入力タイプとは異なる活性パターンを見ることが容易である:ビット不自然であるが、アクティブパターンのこのタイプは、多くの場合、変換で使用される

let (|StringValue|) (i:int) = sprintf "%i" i 

let (StringValue s) = 1 // s is of type string, with value "1" 
関連する問題