OCaml |> 运算符

OCaml |> operator

谁能解释一下 |> 运算符的作用?此代码取自参考 here:

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

我知道它的作用,但我不知道如何应用 |> 运算符。

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

|>运算符表示反向函数应用。这听起来很复杂,但它只是意味着您可以将函数(可能还有一些额外的参数)放在您想要应用它的值之后。这使您可以构建看起来像 Unix 管道的东西:

# let ( |> ) x f = f x;;
val ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# 0.0 |> sin |> exp;;
- : float = 1.

表示法Module.(expr)用于为one表达式临时打开模块。换句话说,您可以直接在表达式中使用模块中的名称,而无需在模块名称前加上前缀。

|> 运算符看起来像 bash 中的 |

基本思路是

e |> f = f e

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

作为一个例子,你可以使用它(虽然我并不特别认为你应该这样做)来避免让:

12 |> fun x -> e

而不是

let x = 12 in e

对于Module.()的事情,就是使用给定模块的特定功能。

您可能以前看过 List.map。 您当然可以使用 open List,然后仅使用 map 引用该函数。但是如果你之后还 open Arraymap 现在指的是 Array.map 所以你需要使用 List.map.

Module.(e)等同于let open Module in e。这是一个 shorthand 语法来引入范围内的东西。

运算符 |> 在模块 Pervasives 中定义为 let (|>) x f = f x。 (实际上,它被定义为一个外部原语,更容易编译。这在这里并不重要。)它是 reverse application 函数,可以更容易地链接连续调用。没有它,你需要写

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

需要更多括号。