2015-12-11 62 views
0

我必須完成以下表達式才能評估爲真。必須有一個插入,適合所有人。clojure減少。沒有開始值,空收集

(= 15 (reduce __ [1 2 3 4 5])) 
(= 0 (reduce __ [])) 
(= 6 (reduce __ 1 [2 3])) 

第三表達提供了一個起始值。因此,我的替換不能提供另一個。

該功能將通過所述第一和第三測試真理:

#(+ %1 %2) 

然而,第二表達產生以下錯誤:

clojure.lang.ArityException:ARGS數目錯誤(0)傳遞給(...我的功能ID)

它看起來像平時減少調用給定函數只有在開始值+集的長度比2大。如果這個長度爲0,像CA如上所述,它也被稱爲 - 有0個參數。

有沒有人有提示如何在這裏進行?

+3

暗示:什麼是'(+)'結果? – nha

+0

謝謝!當然,它不能簡單得多! (我的解決方案在此期間是:(fn [&more](if(=(count more)0)0(apply + more)))ha,ha) –

+1

很有幫助,你仍然可以簡化它, )如果您使用4clojure,請不要猶豫尋找其他解決方案。 – nha

回答

0

從註釋中,該解決方案顯然是+,但也許是有價值的看它在一些細節看到爲什麼。事實證明,這有很多。

首先,讓我們來看看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]:IFnJava interface for clojure functions