Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匿名函数使用另一个匿名函数-clojure koan_Clojure - Fatal编程技术网

匿名函数使用另一个匿名函数-clojure koan

匿名函数使用另一个匿名函数-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 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.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

  • 请参见1的答案--“5”不是函数。使用描述性名称,轻松发现问题:

    ((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)))
    
  • .