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?
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