有人可以解释下面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)
答案 0 :(得分:5)
请参阅(doc reduce)
:
[...] 如果coll包含no items,f也必须不接受任何参数,并且reduce返回 调用没有参数的f的结果。 [...]
这里的coll是nil
,它实际上被视为不包含任何项目的集合(因为它通常在类似的上下文中),而f
是#(%1)
。
因此调用#(%1)
时没有参数,最终抛出你看到的异常。