Der Pipe Operator ist einfach syntaktischer Zucker für verkettete Methodenaufrufe. Es ist sehr ähnlich wie linq Ausdrücke in C# ausgedrückt werden.
Erklärung von here:
Vorlauf Operator Ich liebe diesen Kerl. Der Vorlauf Operator ist einfach definiert als:
let (|>) x f = f x
Und eine Art Signatur hat:
'a -> ('a -> 'b) -> 'b
was übersetzt: ein generischer Typ gegeben ‚a, und eine Funktion, die eine nimmt‘ ein und kehrt zurück a 'b, dann die Anwendung der Funktion auf die Eingabe zurückgeben.
Anstatt dies zu erklären, lassen Sie mich Ihnen ein Beispiel, wo es verwendet werden kann:
// Take a number, square it, then convert it to a string, then reverse that string
let square x = x * x
let toStr (x : int) = x.ToString()
let rev (x : string) = new String(Array.rev (x.ToCharArray()))
// 512 -> 1024 -> "1024" -> "4201"
let result = rev (toStr (square 512))
Der Code sehr einfach ist, aber Hinweis, wie widerspenstig die Syntax sieht. Alles, was wir tun wollen, ist, das Ergebnis einer Berechnung zu nehmen und es an die nächste Berechnung zu übergeben. Wir könnten es neu schreiben, indem wir eine Reihe neuer Variablen einführen:
let step1 = square 512
let step2 = toStr step1
let step3 = rev step2
let result = step3
Aber jetzt müssen Sie alle diese temporären Variablen gerade halten. Der Operator (|>) nimmt einen Wert an und leitet ihn an eine Funktion weiter, so dass Sie im Wesentlichen den Parameter einer Funktion vor dem Funktionsaufruf angeben können. Dies vereinfacht den F # -Code erheblich, da Sie Funktionen zusammenführen können, wobei das Ergebnis von einem in das nächste übernommen wird. So verwendet das gleiche Beispiel kann der Code eindeutig geschrieben werden als:
let result = 512 |> square |> toStr |> rev
bearbeiten:
In F #, was Sie wirklich mit einem Methodenaufruf zu tun ist, eine Funktion zu nehmen und dann nicht mehr anzuwenden, der folgende Parameter, so in Ihrem Beispiel wäre es List.map (fun x -> x * x * x)
wird auf [2;4;6]
angewendet.Alles, was der Rohrbediener macht, nimmt die Parameter in umgekehrter Reihenfolge und macht dann die Anwendung rückgängig.
Funktion: List.map (fun x -> x * x * x)
Parameter: [2;4;6]
Standard-F # Aufruf-Syntax: f g
Reversed F # Aufruf-Syntax: g f
Standard:
let var = List.map (fun x -> x * x * x) [2;4;6]
Umgekehrt:
let var = [2;4;6] |> List.map (fun x -> x * x * x)
der Operator ist Infix nicht Präfix - Sie wenden es auf die falschen Dinge –