OCaml |>操作者

时间:2015-05-27 21:41:02

标签: ocaml

有人可以解释一下|>运营商呢?此代码取自参考here

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

我可以看到它的作用,但我不知道如何应用|>否则就是运营商。

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

3 个答案:

答案 0 :(得分:23)

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

运算符let open Module in e在模块|>中定义为Pervasives。 (实际上,它被定义为外部原语,更容易编译。这在这里并不重要。)它是反向应用程序函数,它可以更容易地连接连续调用。没有它,你需要写

let (|>) x f = f x

需要更多括号。

答案 1 :(得分:13)

For Each a As String() in aAllGrades For Each aa As String in a Console.WriteLine(aa) Next Next 运算符与bash中的|>类似。

基本理念是

|

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

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

e |> f = f e

而不是

12 |> fun x -> e

对于let x = 12 in e 事物,它是使用给定模块的特定函数。

您之前可能已经看过Module.()。 您当然可以使用List.map,然后仅使用open List来引用该函数。但如果您之后也mapopen Array现在指的是map,那么您需要使用Array.map

答案 2 :(得分:7)

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

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

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