Ocaml中的链接调用

kun*_*ami 2 ocaml

我试图以更迫切的方式表达一组链式调用.例如,image我们有一个带有列表和元素的函数,它将元素追加到列表的末尾:

let insert l e =
  l @ [e]
Run Code Online (Sandbox Code Playgroud)

我想一次插入一些元素.一种功能性的方法可能是:

let myList = insert (insert (insert [] 3) 4) 5)
Run Code Online (Sandbox Code Playgroud)

我最近了解了有关|>表达性的操作符.与currying一起,它可以导致干净的链接.问题是我们需要先绑定第二个参数.这需要定义一个函数来反转参数(这实际上是|>:P):

let myList =
  let insertIn l e = insert e l in
    [] |>
    insertIn 3 |>
    insertIn 4 |>
    insertIn 5
;;
Run Code Online (Sandbox Code Playgroud)

这几乎是我想要的,除了需要定义insertIn.有更清洁的方法吗?

我希望有一个特殊的运算符$,它可以表示前一个函数的返回值:

let myList =
  [] |>
  insert $ 3 |>
  insert $ 4 |>
  insert $ 5
;;
Run Code Online (Sandbox Code Playgroud)

Tar*_*mil 5

一种可能的方法,在Haskell中很常见,使用flip:

let flip f x y = f y x

let myList =
  [] |>
  flip insert 3 |>
  flip insert 4 |>
  flip insert 5
Run Code Online (Sandbox Code Playgroud)

但实际上,如果insert函数是您自己编写的函数,那么您应该考虑通过以下任一方式更改其定义:

(另外,旁注:你insert的效率非常低,因为你l每次都要复制整个;列表的设计是通过在前面添加元素而::不是附加到后面来构造.)