我试图以更迫切的方式表达一组链接的电话。例如,image我们有一个带有列表和元素的函数,它将元素追加到列表的末尾:
let insert l e =
l @ [e]
我想一次插入一些元素。实现这一目标的一种功能方式可能是:
let myList = insert (insert (insert [] 3) 4) 5)
我最近了解了|>
运算符,这有助于表达性。与currying一起,它可以导致干净的链接。问题是我们需要先绑定第二个参数。这需要定义一个函数来反转参数(实际上是|>
所做的:P):
let myList =
let insertIn l e = insert e l in
[] |>
insertIn 3 |>
insertIn 4 |>
insertIn 5
;;
这几乎是我想要的,除了需要定义insertIn
。有更清洁的方法吗?
我希望有一个像$
这样的特殊运算符可以表示前一个函数的返回值:
let myList =
[] |>
insert $ 3 |>
insert $ 4 |>
insert $ 5
;;
答案 0 :(得分:5)
一种可能的方法,在Haskell中很常见,使用flip
:
let flip f x y = f y x
let myList =
[] |>
flip insert 3 |>
flip insert 4 |>
flip insert 5
但实际上,如果insert
函数是您自己编写的函数,那么您应该考虑使用以下任一方式更改其定义:
翻转其参数,使列表最后,即“标准库样式”:
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
(另外,旁注:你的insert
效率非常低,因为你每次都要复制整个l
;列表的设计是通过在{{1 },而不是追加到后面。)
答案 1 :(得分:2)
let (|>) x f y = f x y;;
let myList =
(((
[] |>
insert ) 3 |>
insert ) 4 |>
insert ) 5
;;
val myList : int list = [3; 4; 5]