当fns作为params传递时,执行函数向量不起作用

时间:2017-08-18 02:48:38

标签: clojure

此代码不起作用:

(((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我已经看到了其他解决方案,但我对此具体实施感到好奇。

1 个答案:

答案 0 :(得分: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。看起来很复杂,但不适用于其他输入数据。