Frage

In Microsofts F # Proben , sie nutzen den ">>" Operator als folgt:

test |> Seq.iter (any_to_string >> printfn "line %s");

Was bedeutet der ">>" Operator in diesem Zusammenhang tun? Wird jedes Element der Sequenz (ein Array in diesem Fall) erhalten weitergegeben implizit any_to_string? Ist das ähnlich wie (fun item -> printfn "line %A" item)?

War es hilfreich?

Lösung

Ein äquivalentes Stück Code die folgende Art und Weise geschrieben werden:


test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))

Mit anderen Worten, der >> Bediener einfach tun dies: Da eine Funktion f (x) wiederkehrender Typ T und g (y) mit y Wesen vom Typ T, können Sie f verwenden >> g eine Funktion h zu erstellen ( z) äquivalent zu g (f (x)). Kein Argument, aber die innere und die äußere Funktion zu diesem Betreiber übergeben werden und das Ergebnis ist eine Funktion, die jederzeit in Ihrem Code angewendet werden kann, so könnte man dies tun:


//myFunc accepts any object, calls its ToString method, passes ToString
//result to the lambda which returns the string length. no argument is
//specified in advance
let myFunc = any_to_string >> (fun s -> s.Length)
let test = 12345
let f = 12345.0
//now we can call myFunc just like if we had definied it this way:
//let myFunc (x:obj) = obj.ToString().Length
printfn "%i" (myFunc i)
printfn "%i" (myFunc f)

Andere Tipps

(>>) ist eine Funktion höhere Ordnung, die zwei Funktionen (mit kompatibelen Argumenten) und kombiniert ( „schreibt“), um sie in eine Funktion übernimmt.

Zum Beispiel mit

let len (s : string) = s.Length
let show (n : int) = n.ToString()

Die Zeile

(show >> len) 15

entspricht

len (show 15)

sowie

show 15 |> len

Die Definition bei

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Core.Operators.html

sagt

val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first

Aber ich hoffe, dass andere eine tiefer gehende Erklärung liefern.

EDIT

MSDN doc jetzt auf

http://msdn.microsoft.com/ en-us / library / ee353825 (VS.100) aspx

Es ist eine Funktion Zusammensetzung Operator (wie in den anderen Beiträgen beschrieben)

Sie können diesen Operator definieren, indem Sie sich selbst um seine Semantik zu sehen:

let (>>) f g = fun x -> g (f x)

Dies kann überhaupt keine Hilfe sein, wenn Sie mit C #, Generika sind unbequem oder Lambda, aber hier ist eine äquivalent in C #:

//Takes two functions, returns composed one
public static Func<T1, T2> Compose<T1, T2, T3>(this Func<T1, T2> f, Func<T2, T3> g)
{
    return (x) => g(f(x));
}

Mit Blick auf den Parametern des Typs liest so etwas wie Brians Antwort:

Compose nimmt eine Funktion, die von T1 bis T2 geht, und eine andere, von T2 bis T3 geht, und gibt die Kombination von den beiden, die sich von T1 bis T3 geht.

Der >> Operator führt Funktion Komposition, die ganz gut erklärt auf Wikipedia . Dustin Campbell stellt einen großen Nutzen für sie und erklärt sie (zusammen mit dem |> (Vorlauf) Operator)

scroll top