无法理解这个clojure make-adder的例子

时间:2012-05-23 13:05:43

标签: clojure

我正在试着读一下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。

提前致谢!

2 个答案:

答案 0 :(得分:6)

make-adder返回一个带有一个参数(z)的函数,传递给make-adder的参数用于为y赋值。设置add2等于使用参数2评估make-adder的结果。因此add2设置为等于make-adder返回的函数,因为y已经分配给make-adder)的参数看起来像

(fn [z] (+ 2 z))

所以(add2 4)调用此函数,其值为6.这有帮助吗?

答案 1 :(得分:3)

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

你的示例make-adder函数(在没有让绑定的情况下重写)

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

这里是使用partial作为x参数重写的add2:

(def add2 (partial make-adder 2))

如果我拨打(add2 2),答案是4,(add2 3),答案是5,依此类推。