OCaml |>运算符

eat*_*hil 18 ocaml

有人可以解释一下|>运算符的作用吗?此代码取自此处的引用:

let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world")
Run Code Online (Sandbox Code Playgroud)

我可以看到它的作用,但我不知道如何应用|>运算符.

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

bya*_*ako 23

Module.(e)相当于let open Module in e.它是一种在范围内引入内容的简写语法.

运算符|>在模块中定义Pervasiveslet (|>) x f = f x.(事实上​​,它被定义为一个外部原语,更容易编译.这在这里并不重要.)它是反向应用程序函数,可以更容易地连接连续调用.没有它,你需要写

let m = PairsMap.(add (1,0) "world" (add (0,1) "hello" empty))
Run Code Online (Sandbox Code Playgroud)

这需要更多的括号.

  • 为了解决OP的具体示例,还值得补充的是 |> 是左关联的 (3认同)

Thé*_*ter 13

|>运营商看起来像|在bash.

基本的想法是

e |> f = f e
Run Code Online (Sandbox Code Playgroud)

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

作为一个例子你可以使用它(我不特别认为你应该),以避免让:

12 |> fun x -> e
Run Code Online (Sandbox Code Playgroud)

代替

let x = 12 in e
Run Code Online (Sandbox Code Playgroud)

对于这Module.()件事,它是使用给定模块的特定功能.

你可能以前见过List.map.你当然可以使用open List,然后只引用函数map.但是,如果你open Array之后,map现在指的是Array.map你需要使用List.map.


Jef*_*eld 7

|>操作者表示逆转功能的应用程序.这听起来很复杂但它只是意味着您可以在要应用它的值之后放置函数(可能还有一些额外的参数).这可以让你构建一个看起来像Unix管道的东西:

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

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