【问题标题】:What is the name of |> in F# and what does it do?|> 在 F# 中的名称是什么,它有什么作用?
【发布时间】:2010-04-13 15:38:30
【问题描述】:

一个真正的 F# 菜鸟问题,但是 |> 调用什么以及它做什么?

【问题讨论】:

标签: f#


【解决方案1】:

它被称为forward pipe operator。它将一个函数的结果传递给另一个函数。

正向管道运算符简单定义为:

let (|>) x f = f x

并且有一个类型签名:

'a -> ('a -> 'b) -> 'b

解析为:给定一个泛型类型 'a,以及一个接受 'a 并返回 'b 的函数,然后返回该函数在输入上的应用。

您可以在article here 中阅读有关其工作原理的更多详细信息。

【讨论】:

  • 谢谢你——我一生都记不起它的名字了
  • 猜猜这是自定义运算符的问题之一,它们无法通过 Google 搜索。
  • 确定它们是:“F# 运算符”,您将获得完整列表
  • 如此强大的算子的实现竟然如此微不足道,这总是让我大吃一惊。
【解决方案2】:

我通常将|>称为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# 中的许多其他情况下使用)。

【讨论】:

    【解决方案3】:

    就 F# 本身而言,名称是 op_PipeRight(尽管没有人会这么称呼它)。我把它发音为“管道”,就像 unix shell 管道一样。

    规范对于弄清楚这些事情很有用。第 4.1 节有运算符名称。

    http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html

    【讨论】:

      【解决方案4】:

      别忘了查看库参考文档:

      http://msdn.microsoft.com/en-us/library/ee353754(v=VS.100).aspx

      列出运算符。

      【讨论】:

        猜你喜欢
        • 2011-01-14
        • 1970-01-01
        • 2019-04-26
        • 2016-04-29
        • 2017-03-02
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多