1

有人可以解释下面 Clojure 代码中的行为吗?我不明白。Clojure 是否以某种方式替换或“优化”函数参数?为什么调用带有单个 nil 参数的函数会导致ArityException?

(defn foo [bar] (reduce #(%1) bar))

(foo nil)
-> ArityException Wrong number of args (0) passed to: test$foo$fn  clojure.lang.AFn.throwArity (AFn.java:437)
4

1 回答 1

5

(doc reduce)

[...] 如果 coll 不包含任何项目, f 也必须不接受任何参数,并且 reduce 返回不带参数调用 f 的结果。[...]

这里 coll is nil,它实际上被视为不包含任何项目的集合(因为它通常在类似的上下文中),并且fis #(%1)

因此#(%1)在没有参数的情况下被调用并最终抛出您看到的异常。

于 2013-08-12T20:24:22.293 回答