2012-04-21 8 views
6

में अनंत मानचित्र मैं कुछ कोड लिख रहा था और मुझे लगा कि मैं ट्यूपल्स की अनंत सूची से एक अनंत मानचित्र बनाने में सक्षम हूं। निम्नलिखित की तर्ज पर कुछ: Map.fromList [(i,i+1)|i<-[1..]]हास्केल

बेशक

, मैं तुरंत पता चला कि Data.Map और Data.Set अनंत मैप्स और सेट क्रमशः समर्थन नहीं करते। मैंने fromList के डेटासेट के लालची कार्यान्वयन के बारे में एक समान सवाल देखा, और here के उत्तरों को पढ़ने के बाद, यह स्पष्ट है कि सेट के लिए आलसी और लालची कार्यान्वयन दोनों संभव हैं, केवल लालची लोग बेहतर काम करते हैं। मैं वास्तव में समझ में नहीं आता, हालांकि, Map.fromList का आलसी कार्यान्वयन क्यों काम नहीं करेगा। कुंजियों को कैसे संग्रहीत किया जाता है इसके साथ कुछ करना है?

+8

आप कैसे जानेंगे कि सूची का कौन सा तत्व अंतिम सूची के बिना अंतिम पेड़ का रूट नोड होगा? – sepp2k

उत्तर

13

Data.Map एक संतुलित पेड़ (लगभग बाइनरी, मुझे लगता है) के रूप में लागू किया गया है; इनपुट के बारे में कुछ पूर्व ज्ञान के बिना अनंत बाइनरी पेड़ों को आलसी बनाना और संतुलित करना मुश्किल है! हालांकि, आपको MemoTrie पैकेज की तरह कुछ पसंद हो सकता है, जो बदले में आलसी अनंत प्रयासों (बिट्स) का उपयोग करता है।

> let x = trie (\x -> x+1) 
> untrie x 72 
73 
> untrie x 37 
38