将函数列表应用于参数,clojure

Apply a list of function to parameter, clojure

(def ops '(+ - * /))
(map #(% 2 5) ops)

给予

(5 5 5 5)

这对我来说没有意义。为什么这个 return 是一个 5 的列表而不是函数调用的结果?

clojure 中有一个函数可以完全满足您的需求:juxt: http://clojuredocs.org/clojure.core/juxt

所以你的例子是

(def funcs (juxt + - * /))
(funcs 2 5)

如果有人能很好地解释为什么 map 方法不起作用,我也想听听。

这个有效:(map #(% 2 5) [+ - * /])

这不是:(map #(% 2 5) '[+ - * /])

这也不行:(map #(% 2 5) '(+ - * /))

原因是当您执行 '(+ - * /) 时,您得到的是符号 +、- * 和 / 的列表,而不是它们所指的函数 - 引用也适用于列表的值.

使用向量可以避免这个问题。

如果您绝对想要一个列表,请执行 (map #(% 2 5) (list + - * /))

问题是 '(+ - * /) 是符号列表,而不是函数列表。符号实现 AFn 并且当提供两个参数时,该函数尝试在第一个参数(2 此处)和 returns 第二个参数(5 此处查找符号) 如果查找失败。