2017-08-18 45 views
2

爲indended此代碼不起作用:執行功能的載體不工作時,FNS是作爲傳遞PARAMS

(((fn [& fns] 
    (fn [& params] 
     (reduce #(%2 %1) params fns))) 
    rest reverse) 
[1 2 3 4]) ;; =>() instead of (3 2 1) 

有沒有辦法只解決它改變內部#(%2 %1)

認爲這個問題相當於:如何將(#<core$rest>)轉換爲(rest)

注意:這是我的過程來解決http://www.4clojure.com/problem/58我見過其他的解決方案,但我很好奇這個具體的實現。

回答

4

儘量只使用[params]而非[& params],所以:

(fn [params] (reduce #(%2 %1) params fns)) 

[& params]論點採取集合[1 2 3 4]和包裝了一遍,在list,給([1 2 3 4])作爲種子爲您reduce功能。

如果您只想在#(%2 %1)內更換,則需要拆開([1 2 3 4]),但僅限於第一次。你可以看到first是否返回了一個集合,所以(coll? (first %1)),然後調用(first %1),否則就按原樣保留%1。似乎令人費解,但不會用於其他輸入數據。

+0

太棒了,非常感謝。我在'#(%2%1)'裏面請求修改,因爲我不明白'params',所以這個解決方案是完美的。也感謝您的明確解釋。 – ecoologic