1
我正在閱讀生活Clojure,這個例子reduce
是把我扔了。不明白減少與匿名功能
(reduce (fn [r x]
(+ r (* x x)))
[1 2 3])
[1 2 3]
是輸入到reduce
,與匿名函數沿。
如果向量的每個成員都被傳入,那麼只會填充r
或x
參數,其他參數來自哪裏?
有沒有辦法一步步觀察參數和輸出變化?
我正在閱讀生活Clojure,這個例子reduce
是把我扔了。不明白減少與匿名功能
(reduce (fn [r x]
(+ r (* x x)))
[1 2 3])
[1 2 3]
是輸入到reduce
,與匿名函數沿。
如果向量的每個成員都被傳入,那麼只會填充r
或x
參數,其他參數來自哪裏?
有沒有辦法一步步觀察參數和輸出變化?
有一個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
另外還有一個答案,在我看來,可能對理解'reduce'非常有幫助:https://stackoverflow.com/a/25026200/1287643 –