我试图以更迫切的方式表达一组链式调用.例如,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)
一种可能的方法,在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函数是您自己编写的函数,那么您应该考虑通过以下任一方式更改其定义:
翻转其参数,使列表最后,即"标准库样式":
let insert e l =
l @ [e]
let myList =
[] |>
insert 3 |>
insert 4 |>
insert 5
Run Code Online (Sandbox Code Playgroud)使用命名参数,它允许您将其按顺序传递,即"核心样式":
let insert l ~elt:e =
l @ [e]
let myList =
[] |>
insert ~elt:3 |>
insert ~elt:4 |>
insert ~elt:5
Run Code Online (Sandbox Code Playgroud)(另外,旁注:你insert的效率非常低,因为你l每次都要复制整个;列表的设计是通过在前面添加元素而::不是附加到后面来构造.)