我正在研究 clojure koans,函数中的一个问题需要进一步解释才能让我“明白”并有一个 aha 时刻。我能够编写满足问题的函数。但我不完全理解为什么所有的位都有效。
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 的值代替它所代表的 int 时会出现错误?
问题 3。
((fn [a b] (b a)) 5 (fn [n] (* n n))))
为什么这不会引发错误 (ba) 在这种情况下 b 是 5,它是一个符号。除非是列表,否则括号中的第一项应该是函数或特殊形式?