gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:36:01 24 4
gpt4 key购买 nike

我正在研究 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

为什么当我用 b 的值替换它代表的 int 时会出现错误?

问题3

((fn [a b] (b a)) 5 (fn [n] (* n n))))

为什么这不会抛出错误 (b a) b 在本例中是 5,它是一个符号。括号中的第一项应该是函数或特殊形式,除非它是列表?

最佳答案

  1. 看看第一个函数中的表达式:

    (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。

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

    ((fn [function] (5 function)) ;; problem!!
    (fn [n] (* n n)))

    更改为:

       ((fn [a] (a 5))  ;; 'a' and '5' flipped
    (fn [n] (* n n)))

    让它运行。

  3. 这不是问题:a 是 5,b(b a) 中的函数。使用描述性名称更有意义:

    ((fn [argument function] (function argument)) 
    5
    (fn [n] (* n n)))

关于clojure - 匿名函数使用另一个匿名函数 - clojure koan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10605291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com