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

时间:2015-04-24 16:09:48

标签: clojure

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

给出

(5 5 5 5)

这对我没有意义。为什么返回5的列表而不是函数调用的结果?

3 个答案:

答案 0 :(得分:12)

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

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

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

原因是当你执行'(+ - * /)时,你得到符号+, - *和/的列表,而不是它们引用的函数 - 引用也适用于列表的值。 / p>

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:4)

clojure中有一个功能可以完全符合您的要求:juxthttp://clojuredocs.org/clojure.core/juxt

所以你的例子就是

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

如果有人提出一个很好的解释,为什么map方法不起作用,我也希望听到。