2013-09-22 9 views
7

में विभिन्न आकार के संग्रह के साथ 'मानचित्र' का उपयोग करना मैं मूर्खतापूर्ण तरीके को समझना चाहता हूं जिसके साथ क्लोजर में विभिन्न आकारों के संग्रह पर काम करना है। क्या कोई तरीका है कि मैं कुछ डिफ़ॉल्ट मान के साथ शेष संग्रह को पैड करने के लिए फ़ंक्शन 'मानचित्र' बता सकता हूं?क्लोजर

एक उदाहरण के रूप में, मैं 3 वैक्टर है लगता है:

(def x [1 2 3 4]) 
(def y [1 2 3 4 5]) 
(def z [1 2 3 4 5 6 7]) 

(map + x y z) ; yields (3 6 9 12) 

इस मामले में, मैं कैसे पैड एक्स और शून्य के साथ y और इस उपज हो सकता है:

(3 6 9 12 10 6 7) 

उत्तर

10

map नहीं है इसे स्वयं करें, लेकिन आप वांछित परिणाम प्राप्त करने के लिए concat और repeat के संयोजन का उपयोग कर सकते हैं:

(def x [1 2 3 4]) 
(def y [1 2 3 4 5]) 
(def z [1 2 3 4 5 6 7]) 

(map + 
    (concat x (repeat 0)) 
    (concat y (repeat 0)) 
    z) ; => (3 6 9 12 10 6 7) 

यहां concat, और repeat के लिए API दस्तावेज़ है।

और यहां एक स्केच है कि आप इसे थोड़ा सा कैसे दूर कर सकते हैं, इसलिए आपको यह जानने की आवश्यकता नहीं है कि संग्रह में से कौन सा संग्रह सबसे लंबा है। (उपरोक्त स्निपेट में, यदि आप concat सभी संग्रह (repeat 0) पर आपके पास अनंत अनुक्रम होगा)।

(defn map-longest 
    [f default & colls] 
    (lazy-seq 
    (when (some seq colls) 
    (cons 
     (apply f (map #(if (seq %) (first %) default) colls)) 
     (apply map-longest f default (map rest colls)))))) 

(map-longest + 
      0 
      [1 2 3 4] 
      [1 2 3 4 5] 
      [1 2 3 4 5 6 7]) ; => (3 6 9 12 10 6 7) 

आप this previous question on Stack Overflow के जवाब के रूप में एक जोड़े को दूसरे दृष्टिकोण देख सकते हैं।