gpt4 book ai didi

ocaml - Ocaml 中的链式调用

转载 作者:行者123 更新时间:2023-12-05 08:56:30 28 4
gpt4 key购买 nike

我正在尝试以更命令的方式表达一组链式调用。例如,图像我们有一个函数,它接受一个列表和一个元素,并将该元素附加到列表的末尾:

let insert l e =
l @ [e]

我想一次插入几个元素。一种实用的方法可以是:

let myList = insert (insert (insert [] 3) 4) 5)

我最近了解了 |> 运算符,它有助于表达。与柯里化(Currying)一起,它可以导致干净的链接。问题是我们需要先绑定(bind)第二个参数。这需要定义一个函数来反转参数(这实际上是 |> 所做的 :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
;;

最佳答案

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;列表被设计为通过将元素添加到前面带有 ::,不附加到后面。)

关于ocaml - Ocaml 中的链式调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39936298/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com