從註釋中,該解決方案顯然是+
,但也許是有價值的看它在一些細節看到爲什麼。事實證明,這有很多。
首先,讓我們來看看reduce看需求是什麼:
(defn reduce
"f should be a function of 2 arguments. If val is not supplied,
returns the result of applying f to the first 2 items in coll, then
applying f to that result and the 3rd item, etc. If coll contains no
items, f must accept no arguments as well, and reduce returns the
result of calling f with no arguments. ..."
...
([f coll]
(if (instance? clojure.lang.IReduce coll)
(.reduce ... coll f)
...))
([f val coll]
(if (instance? clojure.lang.IReduceInit coll)
(.reduce ... coll f val)
...)))
這是一個多元數的功能,要麼需要一個功能集合,或功能,初始值的集合。
+也是一個多元函數,它的行爲取決於傳遞給它的參數數量。下面的源代碼(針對我們關心的部分進行了編輯)顯示,0-arity和2-arity滿足了減少。
(defn +
"Returns the sum of nums. (+) returns 0..."
...
([] 0)
...
([x y] (. clojure.lang.Numbers (add x y)))
...
顯然(reduce + [])
調用第一子句和返回0試驗2進行說明。
這通過將附加功能到每對數字,which happens in the Java internals for Clojure的,在緊密for
循環對於第一測試。
最終測試的工作原理與第一個完全相同,只是它調用[v val coll]
執行reduce。這適用於a slightly different internal function,但效果相同。
注
[1]:IFn
是Java interface for clojure functions
暗示:什麼是'(+)'結果? – nha
謝謝!當然,它不能簡單得多! (我的解決方案在此期間是:(fn [&more](if(=(count more)0)0(apply + more)))ha,ha) –
很有幫助,你仍然可以簡化它, )如果您使用4clojure,請不要猶豫尋找其他解決方案。 – nha