不理解使用匿名函数减少

时间:2017-08-06 20:43:28

标签: clojure

我正在阅读Living Clojure,这个reduce的例子让我失望。

(reduce (fn [r x]
          (+ r (* x x)))
        [1 2 3])

[1 2 3]reduce的输入,以及匿名函数。

如果传入了向量的每个成员,那只会填充rx个参数,其他参数来自哪里?

有没有办法逐步观察参数和输出变化?

1 个答案:

答案 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