मैं यह सीखना चाहूंगा कि हास्केल में उन पर कुछ स्थानीय संचालन कैसे किए जा सकते हैं और कुछ स्थानीय ऑपरेशन किए जा सकते हैं, लेकिन प्रश्न हास्केल के लिए विशिष्ट नहीं है, और ग्राफ़ के बजाय हम दोगुनी लिंक वाली सूचियों पर विचार कर सकते हैं।
प्रश्न: एक दोहरी लिंक्ड सूची (या अन्य दोगुनी लिंक्ड या परिपत्र डेटा संरचना) को लागू करने के लिए एक मुहावरेदार या अनुशंसित तरीका क्या होगा जो उस भाषा में संचालन करता है जो मुख्य रूप से अपरिवर्तनीय डेटा संरचनाओं (हास्केल, क्लोचर, आदि) के लिए समर्थन और वकालत करता है। ? विशेष रूप से, इन-प्लेस अपडेट का उपयोग कैसे करें, जो औपचारिक रूप से भाषा द्वारा निषिद्ध हैं?
मैं आसानी से कल्पना कर सकता हूं कि अगर कुछ स्थानीय ऑपरेशन को एक दोहरी लिंक की गई सूची (यदि कोई आइटम उदाहरण के लिए डाला जाता है) पर किया जाता है, तो भाषा की आलस्य के कारण पूरी सूची को तुरंत कॉपी करने की आवश्यकता नहीं हो सकती है। हालाँकि, चूंकि सूची दोहरी रूप से जुड़ी हुई है, अगर इसे एक स्थान पर संशोधित किया गया है, तो पुराने नोड्स में से कोई भी सूची के नए संस्करण में उपयोग नहीं किया जा सकता है, और उन्हें किसी भी तरह से चिह्नित, कॉपी, कचरा-संग्रहित करना होगा। । स्पष्ट रूप से ये निरर्थक कार्य हैं यदि सूची की केवल अद्यतन प्रतिलिपि का उपयोग किया जाएगा, लेकिन वे सूची के आकार के लिए आनुपातिक "ओवरहेड" जोड़ देंगे।
क्या इसका मतलब यह है कि ऐसे कार्यों के लिए अपरिवर्तनीय डेटा केवल अनुचित है, और "देशी" समर्थन के बिना कार्यात्मक डिक्लेक्टिव भाषाएं उत्परिवर्तित डेटा के लिए उतना जरूरी नहीं हैं जितना जरूरी नहीं हैं? या, वहाँ कुछ मुश्किल काम है?
PS मुझे इंटरनेट पर इस विषय पर कुछ लेख और प्रस्तुतियां मिली हैं, लेकिन उनके बाद कठिन समय था, जबकि मुझे लगता है कि इस प्रश्न का उत्तर एक से अधिक पैराग्राफ और शायद एक आरेख नहीं लेना चाहिए ... मेरा मतलब है, अगर वहाँ है इस समस्या का कोई "कार्यात्मक" समाधान नहीं है, इसका उत्तर शायद "सी" का उपयोग करना है। यदि एक है, तो यह कितना जटिल हो सकता है?
संबंधित सवाल
"कार्यात्मक प्रोग्रामिंग में डेटा संरचनाएं" । अक्षम विकल्पों के बजाय इन-प्लेस अपडेट का उपयोग करने के बारे में मेरा विशिष्ट प्रश्न वहां चर्चा नहीं है।
"आंतरिक डेटा संरचनाओं का आंतरिक उत्परिवर्तन" । वहां अनिर्दिष्ट भाषा में निम्न-स्तरीय कार्यान्वयन पर जोर दिया गया है, जबकि मेरा प्रश्न भाषा के सही विकल्प (कार्यात्मक या अन्यथा) के बारे में है और कार्यात्मक भाषाओं में संभव मुहावरेदार समाधानों के बारे में है।
प्रासंगिक उद्धरण
विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषाएं कई एल्गोरिदम को बहुत ही स्पष्ट रूप से व्यक्त करने की अनुमति देती हैं, लेकिन कुछ एल्गोरिदम हैं जिनमें इन-प्लेसडेबल स्टेट महत्वपूर्ण भूमिका निभाते हैं। इन एल्गोरिदम के लिए, विशुद्ध रूप से कार्यात्मक भाषा, जिसमें अपूरणीय राज्य का अभाव है, स्वाभाविक रूप से अक्षम ( [पोन्डर, मैकगियर और एनजी, 1988] ) प्रतीत होते हैं ।
- जॉन लॉन्चबरी और साइमन पेयटन जोन्स, लेज़ी फंक्शनल स्टेट थ्रेड्स (1994), जॉन लॉन्चबरी और साइमन पेटन जोन्स, स्टेट इन हास्केल (1995)। ये पेपर ST
हास्केल में मोनैडिक प्रकार के निर्माणकर्ता का परिचय देते हैं ।
DiffArray
प्रकार को लागू करता है । विवर्तन पैकेज के स्रोत को देखते हुए, मैं 91 घटनाओं को देखता हूं । ऐसा लगता है कि मेरे प्रश्न का उत्तर "हां, नहीं, अपरिवर्तनीय डेटा वाली विशुद्ध रूप से कार्यात्मक भाषाएं एल्गोरिदम को लागू करने के लिए उपयुक्त नहीं हैं जो सामान्य रूप से इन-प्लेस अपडेट पर भरोसा करती हैं"। unsafePerformIO
Map
और IntMap
, या HashMap
) को भंडारण के रूप में उपयोग करना है और नोड्स में लिंक किए गए नोड्स की आईडी है। "कंप्यूटर विज्ञान में सभी समस्याओं को एक अन्य स्तर के अप्रत्यक्ष रूप से हल किया जा सकता है।"