【发布时间】:2015-05-28 06:03:10
【问题描述】:
有人能解释一下 |> 运算符的作用吗?此代码取自参考here:
let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world")
我可以看到它的作用,但我不知道如何应用 |> 运算符。
就此而言,我也不知道 Module.() 语法在做什么。对此进行解释也很好。
【问题讨论】:
标签: ocaml
有人能解释一下 |> 运算符的作用吗?此代码取自参考here:
let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world")
我可以看到它的作用,但我不知道如何应用 |> 运算符。
就此而言,我也不知道 Module.() 语法在做什么。对此进行解释也很好。
【问题讨论】:
标签: ocaml
Module.(e) 等价于let open Module in e。它是在范围内引入事物的简写语法。
运算符|> 在模块Pervasives 中定义为let (|>) x f = f x。 (事实上,它被定义为一个外部原语,更易于编译。这在此处并不重要。)正是 reverse application 函数使得链接连续调用更容易。没有它,您将需要编写
let m = PairsMap.(add (1,0) "world" (add (0,1) "hello" empty))
这需要更多的括号。
【讨论】:
|> 运算符看起来像 bash 中的 |。
基本思路是这样的
e |> f = f e
这是一种按执行顺序编写应用程序的方法。
作为一个例子,你可以使用它(我不认为你特别应该这样做)来避免让:
12 |> fun x -> e
而不是
let x = 12 in e
对于Module.()这个东西,就是使用给定模块的特定功能。
您可能以前见过List.map。
您当然可以使用open List,然后仅使用map 引用该函数。但是如果你之后还open Array,map 现在指的是Array.map,所以你需要使用List.map。
【讨论】:
|> 运算符代表反向函数应用。这听起来很复杂,但这只是意味着您可以将函数(可能还有一些额外的参数)放在要应用到的值之后。这使您可以构建看起来像 Unix 管道的东西:
# let ( |> ) x f = f x;;
val ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# 0.0 |> sin |> exp;;
- : float = 1.
符号Module.(expr) 用于为一个表达式临时打开模块。换句话说,您可以直接在表达式中使用模块中的名称,而无需在模块名称前加上前缀。
【讨论】: