2012-03-06 117 views
1

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

(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

望'fns'不长名单吹堆栈不使用尾递归:) – Ankur 2012-03-06 12:02:52

回答

6

的问题是在可变参数是如何使用的。 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))))) 
相关问题