2012-03-06 184 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))))) 
相關問題