2017-02-09 2 views
3

fand ich diesen Code in dem ausgezeichneten Buch F# Design Patterns von Genen Belitski:Warum verhalten sich aktive Muster so?

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 
*) 

Der Autor stellt fest, dass dieser

„ein etwas dagegen ist Beispiel boggling, die klar, wenn Sie wird nicht vergessen, dass die let einer Bindung Der Wert ist ein Eckfall der Mustererkennung basierend auf Datenzerlegung, so dass I'm active pattern auf das Eingabeargument 40 angewendet wird und das Ergebnis 42 an x ​​bindet. "

Ich verstehe es nicht. Warum wird I'm active pattern auf 40 angewendet, wenn 40 auf der rechten Seite steht? Intuitiv würde ich schätzen, dass y = 38, nicht 42, den Ausdruck let (`` I'm active pattern `` y) = 40 als eine implizite Funktion betrachten.

Kann mir jemand erklären?

+2

Das Beispiel im OP ein wenig gekünstelt, aber diese Art des aktiven Musters oft in convert verwendet wird einige Eingaben für einige Ausgaben (z. B. Zeichenfolge Datum zu DateTime usw.). Und weil Let Mustervergleich ist, erhalten Sie diese Art von Verhalten. Dies ähnelt dem Dekonstruieren von DUs mit "Let". Z.B. 'let (Foo x) = foo' wird den in den Foo DU eingepackten Wert herausnehmen. – s952163

Antwort

7

Das macht aktive Muster besonders; mit einer normalen Funktion spiegelt die Definition let f x = ... die Anwendung von f: Sie können f e durch e für x in der Definition mental bewerten.

dagegen mit einem aktiven Muster let (|P|) x = ..., wenn Sie let (P y) = e die frische Kennung sehen y wird das Ergebnis der Anwendung des Körpers der Definition e erhalten.

Dies ist vielleicht einfacher, mit einem aktiven Muster zu sehen, wo der Ergebnistyp vom Eingabetyp unterscheidet:

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

let (StringValue s) = 1 // s is of type string, with value "1" 
Verwandte Themen