我正在试着读一下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。
提前致谢!
答案 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,依此类推。