क्लोजर कोर या कंट्रीब में जिप फ़ंक्शन के लिए एक समान है?


130

क्लोजर में, मैं दो सूचियों को जोड़कर एक जोड़ी की सूची देना चाहता हूं,

> (zip '(1 2 3) '(4 5 6))  
((1 4) (2 5) (3 6))

हास्केल या रूबी में फंक्शन को जिप कहते हैं । इसे लागू करना मुश्किल नहीं है, लेकिन मैं यह सुनिश्चित करना चाहता था कि मैं कोर या कंट्रीब में एक फ़ंक्शन को याद नहीं कर रहा था।

कोर में एक जिप नेमस्पेस है, लेकिन इसे जिपर फंक्शनल तकनीक तक पहुंच प्रदान करने के रूप में वर्णित किया गया है, जो ऐसा प्रतीत नहीं होता है कि मैं इसके बाद क्या हूं।

क्या कोर में, इस तरह से 2 या अधिक सूचियों के संयोजन के लिए एक समान कार्य है?

यदि ऐसा नहीं है, तो क्या यह इसलिए है क्योंकि एक मुहावरेदार दृष्टिकोण है जो फ़ंक्शन को अनावश्यक रूप से प्रस्तुत करता है?


zipटुपेलो लाइब्रेरी में एक समारोह है: cloojure.github.io/doc/tupelo/tupelo.core.html#var-zip
एलन थॉम्पसन

जवाबों:


220
(map vector '(1 2 3) '(4 5 6))

क्या आप चाहते हैं:

=> ([1 4] [2 5] [3 6])

हास्केल को zipWith( zipWith3,, zipWith4...) कार्यों के संग्रह की आवश्यकता है , क्योंकि वे सभी एक विशिष्ट प्रकार के होने की आवश्यकता है ; विशेष रूप से, इनपुट सूचियों की संख्या जो वे स्वीकार करते हैं, उन्हें ठीक करने की आवश्यकता है। ( zip, zip2, zip3, ... परिवार के एक विशेषज्ञता के रूप में माना जा सकता है zipWithtupling का उपयोग आम तौर पर के लिए परिवार)।

इसके विपरीत, क्लारजुर और अन्य लिस्प्स को परिवर्तनीय धमनी कार्यों के लिए अच्छा समर्थन है; mapउनमें से एक है और हास्केल के समान तरीके से "ट्यूपलिंग" के लिए इस्तेमाल किया जा सकता है

zipWith (\x y -> (x, y))

क्लोजर में एक "टपल" बनाने का मुहावरेदार तरीका है, जैसा कि ऊपर दिखाया गया है, एक छोटे वेक्टर का निर्माण करना।

(पूर्णता के लिए, ध्यान दें कि कुछ बुनियादी एक्सटेंशन के साथ हास्केल वेरिएबल एरिटी फ़ंक्शंस की अनुमति देता है, उनका उपयोग करने के लिए भाषा की अच्छी समझ की आवश्यकता होती है, हालांकि, और वेनिला हस्केल 98 शायद उन्हें बिल्कुल भी समर्थन नहीं करता है, इस प्रकार निश्चित एरिटी फ़ंक्शन बेहतर हैं। मानक पुस्तकालय के लिए।)


8
ध्यान दें कि यह zipतब अलग व्यवहार करता है जब संग्रह समान लंबाई नहीं होते हैं। nilछोटे संग्रह के लिए रूबी प्रसंस्करण और आपूर्ति जारी रखेगी , जबकि क्लोजर एक बार संग्रह समाप्त होने के बाद प्रसंस्करण बंद कर देगा।
नैट डब्ल्यू।

@NateW। यह नोट करने के लिए अच्छा है, धन्यवाद। हास्केल इस संबंध में zipक्लोजर की तरह व्यवहार करता है map
मिचेल मार्कीज

1
क्या मैं वैरिएबल एरीस हास्केल फ़ंक्शंस पर एक संदर्भ के लिए पूछ सकता हूं?
तेदुंए

22
(partition 2 (interleave '(1 2 3) '(4 5 6))) 
=> ((1 4) (2 5) (3 6))

या अधिक आम तौर पर

(defn zip [& colls]
  (partition (count colls) (apply interleave colls)))

(zip '( 1 2 3) '(4 5 6))           ;=> ((1 4) (2 5) (3 6))

(zip '( 1 2 3) '(4 5 6) '(2 4 8))  ;=> ((1 4 2) (2 5 4) (3 6 8))


11

आपको वही देने के लिए जो आप चाहते थे, listदो सूचियों में मैपिंग करने से आपको अपने उदाहरण में सूचियों की एक सूची मिल जाएगी। मुझे लगता है कि कई क्लोजुरियन इसके लिए वैक्टर का इस्तेमाल करेंगे, हालांकि यह किसी भी चीज के साथ काम करेगा। और इनपुट को एक ही प्रकार के होने की आवश्यकता नहीं है। नक्शा उनसे seqs बनाता है और फिर seqs को मैप करता है इसलिए कोई भी seq'able इनपुट ठीक काम करेगा।

(map list '(1 2 3) '(4 5 6))
(map list  [1 2 3] '(4 5 6))
(map hash-map  '(1 2 3) '(4 5 6))
(map hash-set  '(1 2 3) '(4 5 6))

1
मुझे लगता है कि आपका मतलब हैश-मैप और हैश-सेट के बजाय मैप और सेट से है।
cgrand

3

बिल्ट-इन तरीका बस 'इंटरलेवेव' फंक्शन होगा:

(interleave [1 2 3 4] [5 6 7 8]) => [1 5 2 6 3 7 4 8]

6
ओ पी के लक्ष्य को प्राप्त करने के लिए आप जोड़ना चाहिए(partition 2 (interleave [1 2 3 4][5 6 7 8]))
skuro

हां - ऐसा प्रतीत होता है कि मैंने ओपी के वांछित आउटपुट को बहुत करीब से नहीं देखा।
lsh

-1

Zipmap नामक एक फ़ंक्शन है, जिसका समान प्रभाव हो सकता है, (zipmap (1 2 3)(4 5 6)) ouput फॉलोवर्स के रूप में है: {3 6, 2 5, 1 4}


zipmap आपको एक नक्शा लौटाता है, जो आदेश की गारंटी नहीं देता है
इल्या शिंकरेंको

-2

# (मानचित्र सूची% लागू करें) पायथन जिप * फ़ंक्शन की तरह एक मैट्रिक्स को स्थानांतरित करता है। एक स्थूल परिभाषा के रूप में:

उपयोगकर्ता => (डिफमैरो पी-जिप [lst] `(मानचित्र सूची लागू करें ~ lst))

# 'उपयोगकर्ता / py-जिप

उपयोगकर्ता => (py-zip '((1 2 3 4) (9 9 9 9) (5 6 7 8))

((१ ९ ५) (२ ९ ६) (३ ९ 4) (४ ९))

उपयोगकर्ता => (py-zip '((१ ९ ५) (२ ९ ६) (३ ९ () (४ ९ y))

((1 2 3 4) (9 9 9 9) (5 6 7 8))


यह केवल 'मानचित्र' का उपयोग करने से बेहतर कैसे है? और यहाँ स्थूल की क्या बात है?
डेव न्यूटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.