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

È stato utile?

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

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

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top