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

Foi útil?

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

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Core.Operators.html

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top