gpt4 book ai didi

clojure - (fn [f & args] (apply f args)) 的标准版本或惯用用法

转载 作者:行者123 更新时间:2023-12-04 00:11:56 25 4
gpt4 key购买 nike

我经常发现自己想要在几个参数集合上应用一个函数集合。使用 map 和一个非常简单的函数很容易做到。

(map
(fn invoke [f & args] (apply f args))
[- + *]
[1 2 3]
[1 2 3]
[1 2 3])

(-1 6 27)

搜索网络会发现很多定义类似函数的库,通常称为 funcall 或 invoke。由于 Clojure 对可变参数函数的偏爱,我不禁认为应该已经有这个函数的默认版本了。

有没有,或者有没有另一种惯用的方法来解决这样的情况?

编辑:

另一种形式可能是
(map
(comp eval list)
[- + *]
[1 2 3]
[1 2 3]
[1 2 3])

(-1 6 27)

由于评估,这让我感到害怕。

最佳答案

没有 funcall或标准 Clojure 库中以这种方式工作的等效函数。 “apply”非常接近,但最后需要一组参数,而不是纯粹的可变参数。

考虑到这一点,您可以通过在末尾添加一个无限的 nil 列表(被视为附加参数的空序列)来“欺骗” apply 以使其工作如下:

(map apply [- + *] [1 2 3] [1 2 3] [1 2 3] (repeat nil))
=> (-1 6 27)

总的来说,如果你真的想经常使用这个函数,我认为明智的方法就是定义它:
(defn funcall [f & ps]
(apply f ps))

(map funcall [- + *] [1 2 3] [1 2 3] [1 2 3])
=> (-1 6 27)

关于clojure - (fn [f & args] (apply f args)) 的标准版本或惯用用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8182956/

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