2011-01-23 14 views
10

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

यहाँ मैं क्या किया है:

addLists :: (Integral a) => [a] -> [a] -> [a] 
addLists xs ys = map add $ zip xs ys 
    where add (x, y) = x+y 
+3

बीटीडब्ल्यू: 'एड = uncurry (+)'। यह भी ध्यान रखें कि प्रश्न 'zipWith' क्वेरी के लिए [Hoogle] (http://haskell.org/hoogle/) पर पहली हिट है ['(a -> b -> c) -> \ [a \] - > \ [बी \] -> \ [सी \] '] (http://haskell.org/hoogle/?hoogle=%28a+-%3E+b+-%3E+c%29+-%3E+%5Ba% 5D + -% 3E +% 5BB% 5 डी + -% 3E +% 5Bc% 5D)। – ephemient

+0

धन्यवाद ephemient, मैं अगली बार Hoogle पहले कोशिश करेंगे। –

+0

@TomMD, मैं आपकी टिप्पणी के पहले भाग को समझ नहीं पा रहा हूं। –

उत्तर

28

एक zipWith पुस्तकालय समारोह है कि एक आपूर्ति फ़ंक्शन का उपयोग करके दो सूचियों को जोड़ती है। यह बिल्कुल आप यहाँ क्या चाहते हैं करता है और आपको मिलता है:

addLists = zipWith (+) 

यह (+) का उपयोग करता है और आगे तर्क के रूप में दिया सूचियों के तत्वों गठबंधन करने के लिए।

+0

अरे मुझे इसे हराया। –

6

अनुप्रयोगी functor शैली:

import Control.Applicative 

addLists xs ys = getZipList $ (+) <$> ZipList xs <*> ZipList ys 

ध्यान दें कि यह इतना बदसूरत है क्योंकि वहाँ सूची एक अनुप्रयोगी functor बनाने के लिए दो तरीके हैं। पहला (और आईएमएचओ कम उपयोगी) तरीका सभी संयोजनों को लेना है, और इस तरह से "मानक" बन गया है, इसलिए (+) <$> [1,2] <*> [30,40][31,41,32,42] है। दूसरी तरफ सूचियों को ज़िपित करना है क्योंकि हमें यहां आवश्यकता है, लेकिन जैसा कि आपके पास प्रति प्रकार केवल एक प्रकार का वर्ग उदाहरण हो सकता है, हमें सूचियों को ज़िप सूची में लपेटना होगा, और getZipList का उपयोग करके परिणाम को खोलना होगा।

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

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