2012-04-12 15 views
14

क्या हैकेल में दिए गए इंडेक्स में किसी तत्व को प्रतिस्थापित करने के लिए कोई अंतर्निहित फ़ंक्शन है?हास्केल सूची में तत्व को प्रतिस्थापित करता है

उदाहरण:

replaceAtIndex(2,"foo",["bar","bar","bar"])

देना चाहिए:

["bar", "bar", "foo"] 

मैं मैं अपने समारोह बना सकता है पता है, लेकिन यह सिर्फ यह निर्मित किया जाना चाहिए लगता है।

उत्तर

9

वास्तविक सरणी हैं, लेकिन सूचियां वास्तव में सिंगल लिंक्ड सूचियां हैं और तत्व को बदलने की धारणा बिल्कुल स्पष्ट नहीं है (और किसी दिए गए इंडेक्स में किसी तत्व को एक्सेस करने से संकेत मिलता है कि आपको सूची का उपयोग नहीं करना चाहिए, इसलिए संचालन जो इसे प्रोत्साहित कर सकते हैं से बचा जाता है)।

11

जहां तक ​​मुझे पता है (और मिल सकता है) यह डिफ़ॉल्ट रूप से मौजूद नहीं है। हालांकि, वहां मौजूद Data.List तो में splitAt:

replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls 

यह हे (एन), हालांकि है। यदि आप इसे बहुत कुछ कर पाते हैं, तो सरणी जैसे अन्य डेटाटाइप देखें।

+6

यह सामान्य रूप से 'ओ (एन)' नहीं है, लेकिन 'ओ (i) ', जहां' i' विभाजन सूचकांक है (क्योंकि केवल उपसर्ग की प्रतिलिपि बनाने की आवश्यकता है)। यदि वह सूचकांक निरंतर है, तो ऑपरेशन 'ओ (1) 'है। –

+3

हमेशा एक प्रकार का हस्ताक्षर शामिल करने का एक अच्छा विचार: 'replaceAtIndex :: Int -> a -> [a] -> [a] ' –

29

यदि आपको किसी विशिष्ट अनुक्रमणिका में तत्व अपडेट करने की आवश्यकता है, तो सूचियां इसके लिए सबसे अच्छी डेटा संरचना नहीं हैं। आप Data.Sequence से Seq का उपयोग करने पर विचार करना चाहेंगे, इस मामले में जिस कार्य को आप ढूंढ रहे हैं वह update :: Int -> a -> Seq a -> Seq a है।

> import Data.Sequence 
> update 2 "foo" $ fromList ["bar", "bar", "bar"] 
fromList ["bar","bar","foo"] 
+0

यह वही है जो मुझे चाहिए। धन्यवाद! –

+0

मैंने यह किया है। अब, मैं सेक को एक में कैसे बदलूं? –

+0

@ मिकेल बेर्जरनरॉन आप 'डेटा' के साथ 'सेक ए' से '[ए]' प्राप्त कर सकते हैं। डेटा.फोल्डबल.फोल्डर (:) [] '। यदि आपके पास 'f :: a -> a -> a' ऑपरेशन है, तो आप संयुक्त 'ए' मान प्राप्त करने के लिए, कुछ प्रारंभिक तत्व (जैसे 0) के साथ' Data.Foldable.foldr f' को कॉल कर सकते हैं। –

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