为什么这个功能不能按预期工作?

时间:2012-03-06 10:22:34

标签: clojure

为什么此功能无法按预期工作?

(defn my-juxt
  [& fns]
  (if (= 1 (count fns))
    (fn [& a] (list (apply (first fns) a)))
    (fn [& a]
      (cons (apply (first fns) a) ((my-juxt (rest fns)) a)))))

注意:这有效 -

(defn new-juxt
  [& fns]
  (fn [& a]
    (map #(apply % a) fns)))

1 个答案:

答案 0 :(得分:6)

问题在于如何使用varargs。 my-juxt在最后一个字符串中为[& fns]提供了[fns]。结果返回的函数也是如此:它在[& a]提供时期望[a]

以下代码可以使用(请注意另外两个apply

(defn my-juxt
  [& fns]
  (if (= 1 (count fns))
    (fn [& a] (list (apply (first fns) a)))
    (fn [& a]
      (cons (apply (first fns) a) 
            (apply (apply my-juxt (rest fns)) a)))))