Semântica de “>>” operador em F #
Pergunta
O No Microsoft # amostras F , eles usam o ">>" operador seguinte:
test |> Seq.iter (any_to_string >> printfn "line %s");
O que o operador ">>" fazer neste contexto? É cada item da sequência (uma matriz neste caso) são passadas para any_to_string
implicitamente? É este semelhante ao (fun item -> printfn "line %A" item)
?
Solução
Uma peça equivalente de código pode ser escrito da seguinte forma:
test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))
Em outras palavras, o >> operador simplesmente faz isso: dada uma função f (x) retornando tipo T e g (y) com o ser y do tipo T, você pode usar f >> g para criar uma função h ( z) ser equivalente a g (f (x)). Sem argumento, mas a função interna e externa tem de ser passado para o operador eo resultado é uma função que pode ser aplicado a qualquer momento no seu código, para que você poderia fazer isso:
//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)
Outras dicas
(>>)
é uma função de ordem superior que leva duas funções (com argumentos compatíveis) e colheitadeiras ( "compõe") dentro de uma função.
Por exemplo, com
let len (s : string) = s.Length
let show (n : int) = n.ToString()
A linha
(show >> len) 15
é equivalente a
len (show 15)
bem como
show 15 |> len
A definição de
diz
val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first
Mas eu espero que outros irão fornecer uma explicação mais aprofundada.
Editar
MSDN doc agora em
http://msdn.microsoft.com/ en-us / library / ee353825 (VS.100) .aspx
É um operador composição de função (tal como descrito nos outros lugares)
Você pode definir este operador por si mesmo, a fim de ver seus semântica:
let (>>) f g = fun x -> g (f x)
Isto pode ser não ajuda em nada se você está desconfortável com C #, os genéricos, ou lambdas, mas aqui é um equivalente em 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));
}
Olhando para os parâmetros de tipo lê algo como a resposta de Brian:
Compor toma uma função que vai de T1 e T2, e um outro que vai de T2 a T3, e retorna a combinação dos dois, que vai de T1 a T3.
O executa operador composição função >>
, que é explicado muito bem na Wikipedia . Dustin Campbell fornece uma grande utilidade para ele e explica que (juntamente com o |>
(tubo de encaminhamento) operador) em seu blog .