Ocaml中的链接调用

时间:2016-10-08 19:07:56

标签: ocaml

我试图以更迫切的方式表达一组链接的电话。例如,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
;;

2 个答案:

答案 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]