2017-02-09 67 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。「

我不明白。爲什麼I'm active pattern被應用到40,因爲40在右側?直覺上,我猜測y = 38,而不是42,將表達式let (`` I'm active pattern `` y) = 40看作隱式函數。

任何人都可以解釋一下嗎?

+2

在OP的示例是有點做作但這種類型的有源圖案的通常用在轉換中使用一些輸出的一些輸入(例如字符串日期到DateTime等)。因爲讓模式匹配,你會得到這種類型的行爲。這與使用'let'解構DU相似。例如。 'let(Foo x)= foo'將取出包裝到Foo DU中的值。 – s952163

回答

7

這就是使活動模式變得特別的原因;具有正常功能的定義let f x = ...反映了f的應用:通過在定義中用e代替x,可以在心理上評估f e

相比之下,與有源圖案let (|P|) x = ...,當你看到let (P y) = e新鮮的標識y將得到應用定義的身體e的結果。

這是爲了看到與將結果類型從輸入類型不同的有源圖案也許更容易:

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

let (StringValue s) = 1 // s is of type string, with value "1" 
相關問題