有人能解释一下 |> 运算符是做什么的吗?这段代码取自参考 这里:
let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world")
我知道它的作用,但是如果不了解如何应用 |> 运算符,我就无从下手了。
说起来,我也不知道 Module.() 语法在做什么。对此的解释也很好。
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))
需要更多的括号。
|>
运算符看起来像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
。
|>
运算符表示反向函数应用。它听起来很复杂,但实际上只是意味着你可以将函数(以及可能有一些额外的参数)放在你想要应用它的值之后。这使你能够构建类似于Unix管道的东西:# let ( |> ) x f = f x;;
val ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# 0.0 |> sin |> exp;;
- : float = 1.
Module.(expr)
表示临时打开模块,并仅对一个表达式生效。也就是说,您可以在表达式中直接使用模块的名称,而无需在前面加上模块名。
|>
(反向应用运算符)与@@
(应用运算符)之间的区别。 - Hanson Char