我正在研究clojure koans,并且函数中的其中一个问题需要进一步的解释让我“得到它”并拥有一段时间。我能写出满足问题的函数。但我不完全明白为什么所有的工作。匿名函数正在消耗另一个匿名函数 - clojure koan
Clojure> (= 25 ((fn [a b] (b a)) 5 (fn [n] (* n n))))
true
问题1: 我不明白为什么,这将引发一个错误:
Clojure> (= 25 ((fn [b a] (b a)) 5 (fn [n] (* n n))))
java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
所以在上面的唯一的变化是开关的B和A的顺序。 在我的大脑中,我读了“一个需要a和b的函数”或者“b和a”,但是它们的使用方式取决于后面的语句。为什么订单在这一点上很重要?
问题2.
Clojure> (= 25 ((fn [a] (5 a)) (fn [n] (* n n))))
java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
为什么当我替补上场b的值的诠释它代表做我得到一个错误?
Quentions 3.
((fn [a b] (b a)) 5 (fn [n] (* n n))))
为什么这不会引发错误(B A)B在这种情况下是5,它是一个符号。 括号中的第一项预计是函数还是特殊形式,除非它是一个列表?
[Koans在github上(https://github.com/functional-koans/clojure-koans/blob/master/src/koans/functions.clj )。 –