Semantica di operatore “>>” in F #
Domanda
F # campioni , usano l'operatore ">>", come segue:
test |> Seq.iter (any_to_string >> printfn "line %s");
Che cosa significa l'operatore ">>" fare in questo contesto? È ogni elemento della sequenza (un array in questo caso) viene passato al any_to_string
implicitamente? È questo simile a (fun item -> printfn "line %A" item)
?
Soluzione
Un pezzo equivalente di codice potrebbe essere scritto come segue:
test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))
In altre parole, l'operatore >> fa semplicemente questo: data una funzione f (x) ritornando tipo T e g (y) con y essendo di tipo T, è possibile utilizzare f >> g per creare una funzione h ( z) essendo equivalente a g (f (x)). Nessun argomento ma la funzione interna ed esterna deve essere passato a tale operatore e il risultato è una funzione che può essere applicata in qualsiasi momento nel codice, in modo che si possa fare questo:
//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)
Altri suggerimenti
(>>)
è una funzione di ordine superiore che prende due funzioni (con argomenti compatibili) e mietitrebbie ( "compone") li in una funzione.
Per esempio con
let len (s : string) = s.Length
let show (n : int) = n.ToString()
La linea
(show >> len) 15
è equivalente a
len (show 15)
così come
show 15 |> len
La definizione a
dice
val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first
Ma spero che gli altri forniranno una spiegazione più approfondita.
Modifica
doc MSDN ora a
http://msdn.microsoft.com/ it-it / library / ee353825 (VS.100) aspx
E 'un operatore di composizione funzione (come descritto in altri posti)
È possibile definire questo operatore da soli al fine di vedere i suoi semantica:
let (>>) f g = fun x -> g (f x)
Questo può essere alcun aiuto a tutti se si è a disagio con C #, generici o lambda, ma qui è un equivalente 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));
}
Guardando i parametri di tipo recita qualcosa come la risposta di Brian:
composizione richiede una funzione che va da T1 a T2, e un altro che va da T2 a T3, e restituisce la combinazione dei due, che va da T1 a T3.
L'operatore >>
esegui composizione funzione, descritta piuttosto ben su Wikipedia . Dustin Campbell fornisce un grande uso per esso e lo spiega (insieme con l'operatore |>
(tubo in avanti)) sul suo blog .