2017-08-06 50 views
1

我正在閱讀生活Clojure,這個例子reduce是把我扔了。不明白減少與匿名功能

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

[1 2 3]是輸入到reduce,與匿名函數沿。

如果向量的每個成員都被傳入,那麼只會填充rx參數,其他參數來自哪裏?

有沒有辦法一步步觀察參數和輸出變化?

回答

3

有一個description of the first argument on ClojureDocs,但我不得不承認這不是真正的描述。

傳遞作爲第一個參數的函數有兩個參數,第一個是,第二個是當前。如果僅用兩個參數調用reduce,則第一次迭代中的總計是集合的第一項,而第一次迭代中的當前是集合的第二項。如果傳遞三個參數,第二個是在第一次迭代通過初始值,而集合的第一個項目,作爲當前在第一次迭代中傳遞:

(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 
+1

另外還有一個答案,在我看來,可能對理解'reduce'非常有幫助:https://stackoverflow.com/a/25026200/1287643 –