2009-12-14 22 views
27

me di cuenta de algo de código en este sample que contenía el operador >>:En F #, ¿qué significa el operador >>?

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

¿Qué significa el operador >> media/hacer?

Muchas gracias, ahora está mucho más claro. Aquí está mi ejemplo he generado para conseguir la caída de ella:

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

Puedes incluso sea ​​más conciso ahora: ... deje new_list2 = read_lines "myText.txt" |> List.map (trim >> to_upper) ... Esta es la forma en que escribo el procesamiento de datos. – cfern

+0

Impresionante, así que podría convertirlo en: let new_list2 = File.ReadAllLines (path) |> Array.map (trim >> to_upper) ... muy limpio :) gracias – Russell

+0

See, you're learning already :) – cfern

Respuesta

55

Es el operador de composición de funciones.

Más información sobre Chris Smith's blogpost.

Presentación de la Función Composición operador (>>):

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

redactada en: dado dos funciones, f y g, y un valor, x, calcular el resultado de f de xy pase ese resultado a g. Lo interesante aquí es que puede curry la función (>>) y solo pasa los parámetros f y g, el resultado es una función que toma un solo parámetro y produce el resultado g (f (x)) .

Aquí está un ejemplo rápido de componer una función de los más pequeños:

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 

Cuando grabados ejecutados ‘4’.

12

El operador >> Compone dos funciones, de modo x |> (g >> f) = x |> g |> f = f (g x). También hay otro operador << que se compone en la otra dirección, por lo que (f << g) x = f (g x), que puede ser más natural en algunos casos.

1

Los operadores de composición, << y >> se utilizan para unir dos funciones de manera que el resultado de una se convierta en la entrada de la otra. Dado que las funciones son también valores, a menos que tenga en cuenta lo contrario, son tratados como tal de manera que las siguientes expresiones son equivalentes:

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

Específicamente, f2, f3, ...fn y x se tratan como valores y no son evaluados antes de ser pasado como parámetros a sus funciones precedentes. Algunas veces eso es lo que quiere, pero otras veces quiere indicar que el result de una función debe ser la entrada de la otra.Esto se puede realizar utilizando los operadores de composición << y >> así:

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

mismo modo

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

Dado que el operador composición devuelve una función, el parámetro explícito, x, no se requiere a diferencia en los operadores de tuberías x |> fn ... |> f1 o f1 <| ... fn <| x