2017-08-18 20 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