Versuchen Sie, F # aktive Muster zu verstehen, warum kann ich das tun:

7

Ich habe eine Dictionary , über die ich anfangs so iteriert habe:

myDictionary |> Seq.iter (fun kvp -> doSomething kvp.Key kvp.Value)

Später entdeckte ich, dass ich das aktive KeyValue -Muster verwenden konnte, und tat dies:

myDictionary |> Seq.iter (fun (KeyValue (k, v)) -> doSomething k v)

Wenn ich weiß, dass aktive Muster keine Form von Präprozessordirektiven sind, wie kann ich dann das Argument kvp im Lambda für eine Funktion ersetzen, die es zerlegt?

    
MiloDC 27.11.2012, 18:12
quelle

2 Antworten

14

Funktionsargumente werden immer mit Pattern Matching destrukturiert. Zum Beispiel:

%Vor%

Semantisch fun & lt; pat & gt; -> & lt; body & gt; entspricht ungefähr

fun x ->
match x with
| & lt; pat & gt; -> & lt; Körper & gt;
| _ -> raise MatchFailureException(...)

    
kvb 27.11.2012, 18:16
quelle
5

Ich denke, die Antwort von @kvb deckt genug Details ab, warum Sie Muster in den Argumenten von fun verwenden können. Dies ist keine Ad-hoc-Funktion - in F # können Sie Muster überall dort verwenden, wo Sie eine Variable binden können. Um einige der Beispiele von @ kvb in einem anderen Kontext zu zeigen:

%Vor%

Ähnlich können Sie Muster verwenden, wenn Sie fun schreiben. Das Konstrukt match ist etwas leistungsfähiger, weil Sie mehrere Klauseln angeben können.

Aktive Muster sind jetzt nicht wirklich magisch. Sie sind nur normale Funktionen mit speziellen Namen. Der Compiler sucht nach aktiven Mustern im Bereich, wenn ein benanntes Muster gefunden wird. Zum Beispiel ist das Muster, das Sie verwenden, nur eine Funktion:

%Vor%

Das Muster verwandelt ein KevValuePair -Objekt in ein normales F # -Tupel, dem dann ein verschachteltes Muster (k, v) (das das erste Element k und das zweite Element v zuweist) entspricht. Der Compiler übersetzt Ihren Code im Wesentlichen zu:

%Vor%     
Tomas Petricek 27.11.2012 18:43
quelle

Tags und Links