Ocaml中的链式调用

Ocaml中的链式调用,ocaml,Ocaml,我试图以一种更为迫切的方式表达一组链式调用。例如,image我们有一个函数,它接受一个列表和一个元素,并将该元素附加到列表的末尾: let insert l e = l @ [e] 我想插入几个元素,一次一个。实现这一点的功能方法可以是: let myList = insert (insert (insert [] 3) 4) 5) 我最近学习了|>操作符,它有助于提高表达能力。加上咖喱,它可以导致一个干净的链接。问题是我们需要先约束第二个参数。这需要定义一个函数来反转参数(这实际上是|

我试图以一种更为迫切的方式表达一组链式调用。例如,image我们有一个函数,它接受一个列表和一个元素,并将该元素附加到列表的末尾:

let insert l e =
  l @ [e]
我想插入几个元素,一次一个。实现这一点的功能方法可以是:

let myList = insert (insert (insert [] 3) 4) 5)
我最近学习了
|>
操作符,它有助于提高表达能力。加上咖喱,它可以导致一个干净的链接。问题是我们需要先约束第二个参数。这需要定义一个函数来反转参数(这实际上是
|>
所做的:P):

这几乎就是我想要的,除了需要定义
insertIn
。有没有更干净的方法

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

let myList =
  [] |>
  insert $ 3 |>
  insert $ 4 |>
  insert $ 5
;;

Haskell中常见的一种可能方法是使用
flip

let flip f x y = f y x

let myList =
  [] |>
  flip insert 3 |>
  flip insert 4 |>
  flip insert 5
<>但实际上,如果<代码> INSERT /COD>函数是您自己编写的函数,那么您应该考虑以以下方式之一更改其定义:

  • 翻转参数,使列表排在最后,即“标准库样式”:

  • 使用一个命名参数,它允许您按顺序传递它,也称为“核心样式”:


(还有一个旁注:你的
insert
效率很低,因为你每次都在复制整个
l
;列表的设计是通过在元素的前面加上
,而不是在后面加上后缀来构建的。)

我发誓我曾经尝试过标记为currying的方法,但出现了语法错误。我刚刚试过你的例子,效果很好!谢谢
let (|>) x f y = f x y;;

let myList =
 (((
    []         |>
    insert ) 3 |>
    insert ) 4 |>
    insert ) 5
  ;;

 val myList : int list = [3; 4; 5]
let flip f x y = f y x

let myList =
  [] |>
  flip insert 3 |>
  flip insert 4 |>
  flip insert 5
let insert e l =
  l @ [e]

let myList =
  [] |>
  insert 3 |>
  insert 4 |>
  insert 5
let insert l ~elt:e =
  l @ [e]

let myList =
  [] |>
  insert ~elt:3 |>
  insert ~elt:4 |>
  insert ~elt:5