我正在阅读Living Clojure,这个reduce
的例子让我失望。
(reduce (fn [r x]
(+ r (* x x)))
[1 2 3])
[1 2 3]
是reduce
的输入,以及匿名函数。
如果传入了向量的每个成员,那只会填充r
或x
个参数,其他参数来自哪里?
有没有办法逐步观察参数和输出变化?
答案 0 :(得分:3)
有一个description of the first argument on ClojureDocs,但我不得不承认它并不是真正具有描述性的。
作为第一个参数传递的函数有两个参数,第一个是 total ,第二个是 current 。如果仅使用两个参数调用reduce
,则第一次迭代中的 total 是集合的第一项,而第一次迭代中的当前是第二项的第二项采集。如果传递三个参数,则第二个参数是初始值,在第一次迭代中作为 total 传递,而集合的第一项作为当前传递在第一次迭代中:
(reduce (fn [r x] (+ r x)) 0 [1 2 3])
会像这样迭代:
(+ 0 1) ;; initial value and first item of the collection
(+ (+ 0 1) 2) ;; result and second item of the collection
(+ (+ (+ 0 1) 2) 3) ;; result and third item of the collection
虽然没有初始值
(reduce (fn [r x] (+ r x)) [1 2 3])
会像这样迭代:
(+ 1 2) ;; no initial value -> first and second item of the collection
(+ (+ 1 2) 3) ;; result and third item of the collection
您也可以添加println
来查看每次迭代的输入:
(reduce
(fn [r x]
(do
(println (str "r = " r ", x = " x ", (* x x) = " (* x x) ", (+ r (* x x)) = " (+ r (* x x))))
(+ r (* x x))))
[1 2 3])
在REPL中运行它的结果是
r = 1, x = 2, (* x x) = 4, (+ r (* x x)) = 5
r = 5, x = 3, (* x x) = 9, (+ r (* x x)) = 14
14