【问题标题】:OCaml |> operatorOCaml |> 运算符
【发布时间】:2015-05-28 06:03:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    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))
    

    这需要更多的括号。

    【讨论】:

    • 为了解决 OP 的具体示例,还值得补充的是 |> 是左关联的
    • 也称为“自然应用”/“自然组合”。又名数学从左到右,通常的拉丁方式。在数学符号中,自然成分写成“f;g”(它是相反类别的成分)
    【解决方案2】:

    |> 运算符看起来像 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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 谢谢!这是一个非常简单直接的解释。
      猜你喜欢
      • 2015-12-07
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2015-09-18
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多