Clojure“apply”在简单求和函数中抛出ClassCastException

时间:2013-05-22 16:16:36

标签: clojure

此功能

(defn sum [& args] (apply + args))

应该总结所有args序列元素抛出异常。 为什么呢?

user> (defn sum [& args] (apply + args))
#'user/sum
user> (sum [1 2 3])
ClassCastException   java.lang.Class.cast (Class.java:2999)
user> (sum (range 1 10))
ClassCastException   java.lang.Class.cast (Class.java:2999)

(在这个问题How to make a Clojure function take a variable number of parameters?

中也用作示例(不能为我编译)

我在Emacs 24.2 Live with Clojure 1.5.1中使用nrepl

2 个答案:

答案 0 :(得分:3)

当您使用& args指定函数参数时,这意味着args将包含所有其他函数参数的列表。在这种情况下,sum正在获取其所有参数的列表 - 但其参数已经一个列表,所以sum在这里有效的是

(apply + [[1 2 3]])

如果你摆脱了&参数定义中的sum(这样列表只是[args]),你就会得到你想要的东西。

答案 1 :(得分:0)

尝试以下方法。在Clojure中,变量参数是列表本身

(sum 1 2 3)