2011-12-12 20 views
10

मैं एक हैकेल फ़ंक्शन लिखने की कोशिश कर रहा हूं जो पूर्णांक की दो सूचियों में लेता है और दो सूचियों से वैकल्पिक रूप से लिया गया तत्वों के साथ एक सूची उत्पन्न करता है।हास्केल - दो सूचियों से वैकल्पिक तत्व

blend xs ys 

एक उदाहरण::

मैं कार्य हो

blend [1,2,3] [4,5,6] 

लौटना चाहिए

[1,4,2,5,3,6] 

मेरे तर्क दो सूचियों को एक साथ ज़िप करने, वैकल्पिक के जोड़े पैदा है तत्व, फिर किसी भी तरह से उन्हें अपने tuples से हटा दें।

यह उन्हें अपने tuples से हटा रहा है कि मैं यह समझ नहीं सकता कि कैसे कार्यान्वित किया जाए।

उत्तर

18

रिकर्सन-अवरोही के दौरान तर्कों का आदान-प्रदान कैसे करें?

blend (x:xs) ys = x:(blend ys xs) 
blend _ _ = [] 

तुम भी सूचियों के किसी भी संख्या (मैं आप को यह छोड़ देंगे) के लिए इस दृष्टिकोण सामान्यीकरण कर सकते हैं या एक सूची के शेष तत्व ले अन्य खाली है:

blend _ ys = ys 
+0

ऐसा करने का बहुत अच्छा तरीका है! धन्यवाद। – Shabu

6

मैं लूंगा मान लें कि यह होमवर्क है। बशर्ते कि आप निम्न सूची बना सकते हैं (जैसा कि आपने कहा था):

[(1,4),(2,5),(3,6)] 

... आप 2 कार्यों के साथ इसे हल कर सकते हैं:

  1. आप एक सूची [a, b] में एक टपल (a, b) बदलना होगा। पैटर्न मिलान का उपयोग करने का प्रयास करें! इस फ़ंक्शन को आपके पास मौजूद सूची के सभी तत्वों पर लागू किया जाना चाहिए (उर्फ मैप किया गया)।
  2. आपके पास [[1,4],[2,5],[3,6]] जैसी सूचियों की एक सूची होगी, इसलिए आपको एक बड़ी सूची में sublists को संयोजित करने के लिए एक फ़ंक्शन की आवश्यकता है।

इस समस्या को हल करने के लिए निश्चित रूप से अन्य, शायद बेहतर, तरीके हैं, लेकिन आपके मूल दृष्टिकोण को जारी रखना एक अच्छा विचार हो सकता है।

+1

मुझे लगता है कि मूल दिशा में जारी एक '[होमवर्क]' प्रश्न का उत्तर विशेष रूप से सहायक है (जब तक कि दिशा पूरी तरह से गलत न हो, जो इस मामले में, यह नहीं था)। –

4

आप ज़िप करना चाहते हैं, तो सूचियों बजाय tuples के उत्पन्न:

concat $ zipWith (\x y -> [x,y]) [1,2,3] [4,5,6] 

कुछ व्यर्थ मज़ा:

concat $ zipWith ((flip(:)).(:[])) [1,2,3] [4,5,6] 

शायद सबसे आसान तरीका:

import Data.List 
concat $ transpose [[1,2,3],[4,5,6]] 
2

का उपयोग किए बिना एक समाधान concat या स्पष्ट रिकर्सन:

blend l = foldr($)[] . zipWith(.) (map(:)l) . map(:) 

हम भी कर सकते हैं बनाने के इस बिंदु से मुक्त

blend' = (foldr($)[].) . (.map(:)) . zipWith(.) . map(:) 


यह कैसे काम करता है: पहला विपक्ष ऑपरेटरों के साथ दोनों सूचियों को सजाने

\[1,2,3] [4,5,6] -> [1:, 2:, 3:] [4:, 5:, 6:] 

तो हम समारोह रचना के साथ इस एक साथ ज़िप

-> [(1:).(4:), (2:).(5:), (3:).(6:)] 

और आखिरकार इन सभी रचनाओं को रिक्त सूची से रिक्त सूची

-> (1:).(4:) $ (2:).(5:) $ (3:).(6:) $ [] = 1:4:2:5:3:6:[] = [1,4,2,5,3,6] 
+0

इसमें क्या गलत है? – leftaroundabout

संबंधित मुद्दे