gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:37:13 24 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)

这让我因为评估而感到害怕。

最佳答案

如果您确实不知道函数名称,但您知道输入和输出必须是什么,您可以尝试 https://github.com/Raynes/findfn .

(find-arg [-1 6 27] map '% [- + *] [1 2 3] [1 2 3] [1 2 3])
;=> (clojure.core/trampoline)

这告诉我们

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

实际上,您可以在 clojure 中将蹦床滥用为 funcall。但它很难说是惯用的,因为它是一个 Lisp-1。上面的代码计算结果为:

[(trampoline - 1 1 1), (trampoline + 2 2 2), (trampoline * 3 3 3)] 然后变成[-1 6 27](准确地说是lazyseq的a形式)。

正如 Adrian Mouat 在下面的评论中指出的那样,这可能不是解决该问题的首选方法。使用类似 funcall 的构造闻起来有点滑稽。必须有一个更清洁的解决方案。在您找到之前,findfn 可能会有所帮助;-)。

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

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