在Microsoft的F# samples中,他们使用“>>”运算符如下:
test |> Seq.iter (any_to_string >> printfn "line %s");
“>>”是什么运营商在这方面呢?序列中的每个项(在这种情况下是一个数组)是否隐式传递给any_to_string
?这与(fun item -> printfn "line %A" item)
相似吗?
答案 0 :(得分:8)
(>>)
是一个高阶函数,它接受两个函数(带有兼容的参数)并将它们组合(“组合”)成一个函数。
例如
let len (s : string) = s.Length
let show (n : int) = n.ToString()
该行
(show >> len) 15
相当于
len (show 15)
以及
show 15 |> len
答案 1 :(得分:5)
的定义
说
val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first
但我希望其他人能提供更深入的解释。
修改
MSDN doc现在
http://msdn.microsoft.com/en-us/library/ee353825(VS.100).aspx
答案 2 :(得分:5)
可以通过以下方式编写等效的代码:
test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))
换句话说,>>运算符只是这样做:给定函数f(x)返回类型T和g(y),y为类型T,你可以使用f>> g创建一个等于g(f(x))的函数h(z)。没有参数,但内部和外部函数必须传递给该运算符,结果是一个可以在代码中随时应用的函数,所以你可以这样做:
//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)
答案 3 :(得分:3)
它是一个函数组合运算符(如其他帖子中所述)
您可以自己定义此运算符以查看其语义:
let (>>) f g = fun x -> g (f x)
答案 4 :(得分:3)
如果您对C#,generics或lambdas感到不舒服,这可能毫无帮助,但这里有一个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));
}
查看类型参数会读取Brian的回答:
撰写一个函数从T1到T2,另一个函数从T2到T3,然后返回两者的组合,从T1到T3。
答案 5 :(得分:2)
>>
运算符执行函数组合,非常好地解释on Wikipedia。 Dustin Campbell为它提供了很好的用途并对其进行了解释(以及|>
(正向管道)运算符)on his blog。