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

¿Fue útil?

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

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

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top