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