Semántica de “>>” operador en F #
Pregunta
F # muestras , usan el ">>" operador siguiente:
test |> Seq.iter (any_to_string >> printfn "line %s");
¿Qué hace el operador ">>" en este contexto? Está cada elemento de la secuencia (una matriz en este caso) sea traspasada a any_to_string
implícitamente? Es esto similar a (fun item -> printfn "line %A" item)
?
Solución
Una pieza equivalente de código podría ser escrita de la siguiente forma:
test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))
En otras palabras, el >> operador simplemente hace esto: dada una función (x) devolver tipo T y g (y) con el ser y de tipo T, se puede utilizar f >> g para crear una función h f ( z) que es equivalente a g (f (x)). No hay discusión, pero la función interior y exterior tiene que ser pasado a ese operador y el resultado es una función que se puede aplicar en cualquier momento en su código, por lo que podría hacer esto:
//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)
Otros consejos
(>>)
es una función de orden superior que tiene dos funciones (con argumentos compatibles) y cosechadoras ( "compone") en una sola función.
Por ejemplo, con
let len (s : string) = s.Length
let show (n : int) = n.ToString()
La línea
(show >> len) 15
es equivalente a
len (show 15)
así como
show 15 |> len
La definición a
dice
val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first
Pero espero que otros dar una explicación más detallada.
editar
doc MSDN ahora en
http://msdn.microsoft.com/ en-us / library / ee353825 (VS.100) .aspx
Es un operador de composición de funciones (como se describe en los otros mensajes)
Se puede definir este operador por sí mismo con el fin de ver a sus semántica:
let (>>) f g = fun x -> g (f x)
Esto puede ser de ninguna ayuda si se siente incómodo con C #, genéricos, o lambdas, pero aquí es un equivalente en 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));
}
En cuanto a los parámetros de tipo dice algo así como la respuesta de Brian:
Componer realiza una función que va de T1 a T2, y otro que va desde T2 a T3, y devuelve la combinación de los dos, que va de T1 a T3.
El operador >>
realiza composición de la función, que se explica bastante bien en Wikipedia . Dustin Campbell ofrece un gran uso para él y explica que (junto con el) operador |>
(tubería hacia adelante) en su blog .