一个真正的F#noob问题,但是什么是|>被叫,它做了什么?
答案 0 :(得分:12)
它被称为forward pipe operator。它将一个函数的结果传递给另一个函数。
Forward管道运算符简单定义为:
let (|>) x f = f x
并且有一个类型签名:
'a -> ('a -> 'b) -> 'b
解析为:给定泛型类型'a,以及带'a并返回'b的函数,然后在输入上返回函数的应用程序。
您可以在article here中阅读有关其工作原理的更多详细信息。
答案 1 :(得分:8)
我通常将|>
称为管道运算符,但我不确定正式名称是管道运算符还是管道运算符(虽然它可能并不重要,因为名称足够相似以避免混淆: - ))。
@LBushkin已经给出了一个很好的答案,所以我只想添加一些可能也很有趣的观察结果。显然,流水线操作符得到了它的名字,因为它可以用于创建一个管道,可以通过几个步骤处理一些数据。典型用法是使用列表时:
[0 .. 10]
|> List.filter (fun n -> n % 3 = 0) // Get numbers divisible by three
|> List.map (fun n -> n * n) // Calculate squared of such numbers
这给出了结果[0; 9; 36; 81]。此外,运算符是左关联的,这意味着表达式input |> f |> g
被解释为(input |> f) |> g
,这使得可以使用|>
对多个操作进行排序。
最后,我发现非常有趣的是,在许多情况下,流水线操作符对应于面向对象语言的方法链接。例如,之前的列表处理示例在C#中将如下所示:
Enumerable.Range(0, 10)
.Where(n => n % 3 == 0) // Get numbers divisible by three
.Select(n => n * n) // Calculate squared of such numbers
如果您从面向对象的背景中进行操作(虽然它在F#中的许多其他情况下使用),这可能会让您了解何时可以使用运算符。
答案 2 :(得分:3)
就F#本身而言,名称是op_PipeRight(虽然没有人称之为)。我把它称为“管道”,就像unix shell管道一样。
该规范对于搞清楚这些事情非常有用。 4.1节有运营商名称。
http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html
答案 3 :(得分:2)