我正在尝试阅读有关 Clojure 的内容,但我遇到了以下基本示例:
(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
我不明白的是如何add2
将数字 4 传递给 make-adder 函数,以及该函数如何将该数字分配给 z。
提前致谢!
我正在尝试阅读有关 Clojure 的内容,但我遇到了以下基本示例:
(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
我不明白的是如何add2
将数字 4 传递给 make-adder 函数,以及该函数如何将该数字分配给 z。
提前致谢!
make-adder
返回一个接受一个参数 (z) 的函数,传入的参数make-adder
用于为 y 赋值。add2
设置为等于make-adder
使用参数 2 进行评估的结果。因此add2
设置为等于从 返回的函数make-adder
,其中(因为 y 已分配给参数 from make-adder
)看起来像
(fn [z] (+ 2 z))
所以(add2 4)
调用这个计算结果为 6 的函数。这有帮助吗?
对我来说,您似乎正在研究一个有趣的问题。
您的示例 make-adder 函数(在没有 let 绑定的情况下重写)
(defn make-adder [x]
"Returns a function that returns the sum of x and yet to be supplied z."
(fn [z] (+ z x))))
返回一个对 x 和 z 求和的函数,其中 make-adder 必须已经用一个值调用过。我相信您的示例正在实现 Clojure 部分函数,这非常酷。
这是您重写的 make-adder 函数以将其两个参数相加,而不是返回函数(因此我们可以在 add2 中使用 partial),
(defn make-adder
"Returns sum of x and y."
[x y]
(+ x y))
这里是 add2 使用以 2 作为 x 参数的部分重写:
(def add2 (partial make-adder 2))
如果我称(add2 2)
答案为 4,(add2 3)
则答案为 5,依此类推。