का उपयोग कर बेहतर mapcat को समझने के लिए mapcat मैं एक उदाहरण ले लिया:मानचित्र और concat
user> (mapcat #(list % %) [1 2 3])
(1 1 2 2 3 3)
और पुन: पेश करने के लिए क्या दस्तावेज़, का उपयोग कर उद्देश्य पर का वर्णन करने की कोशिश की, नक्शा और concat:
user> (doc mapcat)
clojure.core/mapcat
([f & colls])
Returns the result of applying concat to the result of applying map
to f and colls. Thus function f should return a collection.
ऐसा करने से:
user> (concat (map #(list % %) [1 2 3]))
((1 1) (2 2) (3 3))
हालांकि आप देख सकते हैं कि यह काम नहीं करता है। मैं फिर भी इस तरह कम करने का उपयोग कर सकते है, लेकिन अगर यह सही है पता नहीं है:
user> (reduce #(concat %1 %2) (map #(vec (list % %)) [1 2 3]))
(1 1 2 2 3 3)
ऊपर काम करता है, लेकिन अगर इसे पुन: करने के लिए एक सही तरीका है, नक्शा और concat का उपयोग कर मैं नहीं जानता, क्या मैपकैट करता है।
असल में मैं मैपकैट हुड के तहत काम करता हूं।
क्या चल रहा है और मैं मैपकैट के स्रोत तक कैसे पहुंच सकता हूं? (मैं Emacs + nrepl उपयोग कर रहा हूँ)
'लागू' का उपयोग करना शायद 'कम करें' से बेहतर है क्योंकि 'कम करें' तर्कों की प्रत्येक जोड़ी के लिए 'concat' करेगा।चूंकि 'कॉन्सट' आलसी है, जब मूल्य वास्तव में मजबूर हो जाते हैं तो आप एक _really_ गहरी कॉल स्टैक के साथ समाप्त हो सकते हैं, जिसके परिणामस्वरूप संभवतः एक स्टैक ओवरफ़्लो होता है। [यहां एक साधारण उदाहरण है।] (Https://www.refheap.com/paste/6409) – DaoWen
बस एक टिप - 'कमी' के साथ आपके कार्यान्वयन में, किसी अज्ञात फ़ंक्शन में 'concat' को लपेटने की कोई आवश्यकता नहीं है। यह भी काम करेगा: '(संक्षिप्त (मानचित्र ...) को कम करें) 'और बेहतर है क्योंकि यह खाली इनपुट के मामले को बेहतर तरीके से संभालता है। – Alex