将函数列表应用于参数,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
此处查找符号) 如果查找失败。
(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
此处查找符号) 如果查找失败。