F#中的名称是什么?它有什么作用?

Mar*_*arl 9 f#

一个真正的F#noob问题,但是什么是|>调用,它做了什么?

LBu*_*kin 12

它被称为前向管道操作员.它将一个函数的结果传递给另一个函数.

Forward管道运算符简单地定义为:

let (|>) x f = f x
Run Code Online (Sandbox Code Playgroud)

并有一个类型签名:

'a -> ('a -> 'b) -> 'b
Run Code Online (Sandbox Code Playgroud)

解析为:给定泛型类型'a,以及带'a并返回'b的函数,然后在输入上返回函数的应用程序.

您可以在此处文章中详细了解其工作原理.


Tom*_*cek 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
Run Code Online (Sandbox Code Playgroud)

这给出了结果[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
Run Code Online (Sandbox Code Playgroud)

如果您从面向对象的背景中进行操作(虽然它在F#中的许多其他情况下使用),这可能会让您了解何时可以使用运算符.