OCaml |> 操作符

25

有人能解释一下 |> 运算符是做什么的吗?这段代码取自参考 这里

let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world")

我知道它的作用,但是如果不了解如何应用 |> 运算符,我就无从下手了。

说起来,我也不知道 Module.() 语法在做什么。对此的解释也很好。


请参阅《Real World OCaml 2nd ed》中的前缀和中缀运算符,其中提供了优秀的解释和示例,介绍了|>(反向应用运算符)与@@(应用运算符)之间的区别。 - Hanson Char
3个回答

33
Module.(e)等同于let open Module in e,它是一种简写语法,用于引入范围内的内容。
运算符|>在模块Pervasives中定义为let (|>) x f = f x。(实际上,它被定义为一个外部原语,更容易编译。这里不重要。)它是反向应用函数,使得链式调用更容易。如果没有它,你需要编写:
let m = PairsMap.(add (1,0) "world" (add (0,1) "hello" empty))

需要更多的括号。


3
针对提问者的具体例子,值得补充的是 |> 是左结合的。 - Motorhead
1
也被称为 "自然应用" / "自然合成"。通常采用拉丁语从左到右的方式,即从f到g的顺序进行数学计算。在数学符号中,“自然合成”写作“f;g”(反向范畴中的合成)。 - nicolas

23
|> 运算符看起来像bash中的 | 运算符。
基本思想是:
e |> f = f e

这是一种按执行顺序编写应用程序的方式。

例如,您可以使用它(尽管我并不特别认为您应该这样做)来避免使用 let:

12 |> fun x -> e

取代

let x = 12 in e

在使用Module.()时,它是用于使用给定模块的特定函数。

你可能以前见过List.map。 当然你可以使用open List然后只使用map引用该函数。但是如果之后你也open Array,那么map现在将引用Array.map,因此你需要使用List.map


11
|> 运算符表示反向函数应用。它听起来很复杂,但实际上只是意味着你可以将函数(以及可能有一些额外的参数)放在你想要应用它的值之后。这使你能够构建类似于Unix管道的东西:
# let ( |> ) x f = f x;;
val ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# 0.0 |> sin |> exp;;
- : float = 1.
Module.(expr) 表示临时打开模块,并仅对一个表达式生效。也就是说,您可以在表达式中直接使用模块的名称,而无需在前面加上模块名。

谢谢!这是非常简单明了的解释。 - Nir Lanka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接