【发布时间】:2010-04-13 15:38:30
【问题描述】:
一个真正的 F# 菜鸟问题,但是 |> 调用什么以及它做什么?
【问题讨论】:
标签: f#
一个真正的 F# 菜鸟问题,但是 |> 调用什么以及它做什么?
【问题讨论】:
标签: f#
它被称为forward pipe operator。它将一个函数的结果传递给另一个函数。
正向管道运算符简单定义为:
let (|>) x f = f x
并且有一个类型签名:
'a -> ('a -> 'b) -> 'b
解析为:给定一个泛型类型 'a,以及一个接受 'a 并返回 'b 的函数,然后返回该函数在输入上的应用。
您可以在article here 中阅读有关其工作原理的更多详细信息。
【讨论】:
我通常将|>称为pipelining operator,但我不确定正式名称是pipe operator还是pipelining operator em>(虽然这可能并不重要,因为名称足够相似以避免混淆:-))。
@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# 中的许多其他情况下使用)。
【讨论】:
就 F# 本身而言,名称是 op_PipeRight(尽管没有人会这么称呼它)。我把它发音为“管道”,就像 unix shell 管道一样。
规范对于弄清楚这些事情很有用。第 4.1 节有运算符名称。
http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html
【讨论】:
【讨论】: