5

我正在尝试阅读有关 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。

提前致谢!

4

2 回答 2

7

make-adder返回一个接受一个参数 (z) 的函数,传入的参数make-adder用于为 y 赋值。add2设置为等于make-adder使用参数 2 进行评估的结果。因此add2设置为等于从 返回的函数make-adder,其中(因为 y 已分配给参数 from make-adder)看起来像

(fn [z] (+ 2 z))

所以(add2 4)调用这个计算结果为 6 的函数。这有帮助吗?

于 2012-05-23T13:13:10.177 回答
3

对我来说,您似乎正在研究一个有趣的问题。

您的示例 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,依此类推。

于 2012-05-23T14:51:44.317 回答