2009-12-14 26 views
27

ho notato in qualche codice in questo sample che conteneva l'operatore >>:In F # cosa significa l'operatore >>?

let printTree = 
    tree >> Seq.iter (Seq.fold (+) "" >> printfn "%s") 

Che cosa significa l'operatore >> media/fare?

Grazie mille, ora è molto più chiaro. Ecco il mio esempio ho generato per ottenere il blocco di esso:

open System 
open System.IO 

let read_lines path = File.ReadAllLines(path) |> Array.to_list 

let trim line = (string line).Trim() 
let to_upper line = (string line).ToUpper() 

let new_list = [ for line in read_lines "myText.txt" -> line |> (trim >> to_upper) ] 

printf "%A" new_list 
+0

È possibile anche sii più conciso ora: ... let new_list2 = read_lines "myText.txt" |> List.map (trim >> to_upper) ... Questa è la forma in cui scrivo io stesso i dati. – cfern

+0

Impressionante, quindi potrei trasformarlo in: let new_list2 = File.ReadAllLines (percorso) |> Array.map (trim >> to_upper) ... molto pulito :) grazie – Russell

+0

Vedi, stai imparando già :) – cfern

risposta

55

È l'operatore di composizione delle funzioni.

Ulteriori informazioni su Chris Smith's blogpost.

Introducendo la funzione Composizione operatore (>>):

let inline (>>) f g x = g(f x)

che recita: date due funzioni, f e G, e un valore, x, calcolare il risultato di f di x e passare quel risultato a g. La cosa interessante qui è che puoi curry la funzione (>>) e passare solo nei parametri f e g, il risultato è una funzione che prende un parametro singolo e produce il risultato g (f (x)) .

Ecco un rapido esempio di composizione di una funzione di quelli più piccoli:

let negate x = x * -1 
let square x = x * x 
let print x = printfn "The number is: %d" x 
let square_negate_then_print = square >> negate >> print 
asserdo square_negate_then_print 2 

Quando le stampe eseguite ‘-4’.

12

L'operatore >> compone di due funzioni, così x |> (g >> f) = x |> g |> f = f (g x). C'è anche un altro operatore << che compone nell'altra direzione, in modo che (f << g) x = f (g x), che in alcuni casi potrebbe essere più naturale.

1

Gli operatori di composizione, << e >> vengono utilizzati per unire due funzioni in modo che il risultato di uno diventi l'input dell'altro. Poiché le funzioni sono valori, se non altrimenti nota, sono trattati come tali in modo che le seguenti espressioni sono equivalenti:

f1 f2 f3 ... fn x = (..((f1 f2) f3) ... fn) x

particolare, f2, f3, ...fn e x sono trattati come valori e non vengono valutati prima di essere passato come parametri alle loro funzioni precedenti. A volte questo è ciò che vuoi ma altre volte vuoi indicare che il result di una funzione deve essere l'input dell'altro.Questo può essere realizzato utilizzando gli operatori di composizione << e >> così:

(f1 << f2 << f3 ... << fn) x = f1(f2(f3 ... (fn x)..)

Analogamente

(fn >> ... f3 >> f2 >> f1) x = f1(f2(f3 ... (fn x)..)

Poiché l'operatore composizione restituisce una funzione, il parametro esplicito, x, non è richiesto dissimile negli operatori di tubi x |> fn ... |> f1 o f1 <| ... fn <| x