匿名函数使用另一个匿名函数-clojure koan
我正在研究clojure koans,函数中的一个问题需要进一步解释,以便我“理解”并有一个愉快的时刻。我能够写出满足这个问题的函数。但我不完全理解为什么所有的比特都能工作匿名函数使用另一个匿名函数-clojure koan,clojure,Clojure,我正在研究clojure koans,函数中的一个问题需要进一步解释,以便我“理解”并有一个愉快的时刻。我能够写出满足这个问题的函数。但我不完全理解为什么所有的比特都能工作 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.ClassCastExcep
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
((fn [a b] (b a)) 5 (fn [n] (* n n))))
为什么当我用b的值替换它所代表的int时,我会得到一个错误
步骤3.
Clojure> (= 25 ((fn [a] (5 a)) (fn [n] (* n n))))
java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
((fn [a b] (b a)) 5 (fn [n] (* n n))))
为什么不抛出一个错误(b a)b在这个例子中是5,这是一个符号。
括号中的第一项应为函数或特殊形式,除非是列表
(b a)
由于b
是第一位的,因此b
必须是一个函数。在第二个示例中,您试图将5传递给b
,但5不是函数。通过描述性名称,您可以看到您正试图使用5作为函数:
((fn [argument function] (argument function)) ;; problem!!
5
(fn [n] (* n n)))
记住lisps的求值规则:给定此s表达式:
(f x y z)
计算f、x、y和z,并将f作为函数应用于x、y和z((fn [function] (5 function)) ;; problem!!
(fn [n] (* n n)))
改为:
((fn [a] (a 5)) ;; 'a' and '5' flipped
(fn [n] (* n n)))
让它运行a
是5,b
是(b a)
中的一个函数。使用描述性名称更具意义:
((fn [argument function] (function argument))
5
(fn [n] (* n n)))