अपरिवर्तनीय डेटा वाली भाषाओं में दोहरे लिंक किए गए या परिपत्र डेटा संरचनाओं पर संचालन को लागू करने के लिए समाधान


11

मैं यह सीखना चाहूंगा कि हास्केल में उन पर कुछ स्थानीय संचालन कैसे किए जा सकते हैं और कुछ स्थानीय ऑपरेशन किए जा सकते हैं, लेकिन प्रश्न हास्केल के लिए विशिष्ट नहीं है, और ग्राफ़ के बजाय हम दोगुनी लिंक वाली सूचियों पर विचार कर सकते हैं।

प्रश्न: एक दोहरी लिंक्ड सूची (या अन्य दोगुनी लिंक्ड या परिपत्र डेटा संरचना) को लागू करने के लिए एक मुहावरेदार या अनुशंसित तरीका क्या होगा जो उस भाषा में संचालन करता है जो मुख्य रूप से अपरिवर्तनीय डेटा संरचनाओं (हास्केल, क्लोचर, आदि) के लिए समर्थन और वकालत करता है। ? विशेष रूप से, इन-प्लेस अपडेट का उपयोग कैसे करें, जो औपचारिक रूप से भाषा द्वारा निषिद्ध हैं?

मैं आसानी से कल्पना कर सकता हूं कि अगर कुछ स्थानीय ऑपरेशन को एक दोहरी लिंक की गई सूची (यदि कोई आइटम उदाहरण के लिए डाला जाता है) पर किया जाता है, तो भाषा की आलस्य के कारण पूरी सूची को तुरंत कॉपी करने की आवश्यकता नहीं हो सकती है। हालाँकि, चूंकि सूची दोहरी रूप से जुड़ी हुई है, अगर इसे एक स्थान पर संशोधित किया गया है, तो पुराने नोड्स में से कोई भी सूची के नए संस्करण में उपयोग नहीं किया जा सकता है, और उन्हें किसी भी तरह से चिह्नित, कॉपी, कचरा-संग्रहित करना होगा। । स्पष्ट रूप से ये निरर्थक कार्य हैं यदि सूची की केवल अद्यतन प्रतिलिपि का उपयोग किया जाएगा, लेकिन वे सूची के आकार के लिए आनुपातिक "ओवरहेड" जोड़ देंगे।

क्या इसका मतलब यह है कि ऐसे कार्यों के लिए अपरिवर्तनीय डेटा केवल अनुचित है, और "देशी" समर्थन के बिना कार्यात्मक डिक्लेक्टिव भाषाएं उत्परिवर्तित डेटा के लिए उतना जरूरी नहीं हैं जितना जरूरी नहीं हैं? या, वहाँ कुछ मुश्किल काम है?

PS मुझे इंटरनेट पर इस विषय पर कुछ लेख और प्रस्तुतियां मिली हैं, लेकिन उनके बाद कठिन समय था, जबकि मुझे लगता है कि इस प्रश्न का उत्तर एक से अधिक पैराग्राफ और शायद एक आरेख नहीं लेना चाहिए ... मेरा मतलब है, अगर वहाँ है इस समस्या का कोई "कार्यात्मक" समाधान नहीं है, इसका उत्तर शायद "सी" का उपयोग करना है। यदि एक है, तो यह कितना जटिल हो सकता है?


संबंधित सवाल


प्रासंगिक उद्धरण

विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषाएं कई एल्गोरिदम को बहुत ही स्पष्ट रूप से व्यक्त करने की अनुमति देती हैं, लेकिन कुछ एल्गोरिदम हैं जिनमें इन-प्लेसडेबल स्टेट महत्वपूर्ण भूमिका निभाते हैं। इन एल्गोरिदम के लिए, विशुद्ध रूप से कार्यात्मक भाषा, जिसमें अपूरणीय राज्य का अभाव है, स्वाभाविक रूप से अक्षम ( [पोन्डर, मैकगियर और एनजी, 1988] ) प्रतीत होते हैं

- जॉन लॉन्चबरी और साइमन पेयटन जोन्स, लेज़ी फंक्शनल स्टेट थ्रेड्स (1994), जॉन लॉन्चबरी और साइमन पेटन जोन्स, स्टेट इन हास्केल (1995)। ये पेपर STहास्केल में मोनैडिक प्रकार के निर्माणकर्ता का परिचय देते हैं ।



2
संदर्भ के लिए धन्यवाद। मुझे उसकी थीसिस मिल गई है
एलेक्सी

यह पेपर आशाजनक लगता है: डेविड किंग और जॉन लॉन्चबरी द्वारा हस्केल (1994) में आलसी गहराई-पहली खोज और रैखिक ग्राफ एल्गोरिदम
अलेक्सी

ऐसा लगता है कि सरणियों के साथ एक समान समस्या को डिफरेंशियल पैकेज द्वारा संबोधित किया जाता है जो कि DiffArrayप्रकार को लागू करता है । विवर्तन पैकेज के स्रोत को देखते हुए, मैं 91 घटनाओं को देखता हूं । ऐसा लगता है कि मेरे प्रश्न का उत्तर "हां, नहीं, अपरिवर्तनीय डेटा वाली विशुद्ध रूप से कार्यात्मक भाषाएं एल्गोरिदम को लागू करने के लिए उपयुक्त नहीं हैं जो सामान्य रूप से इन-प्लेस अपडेट पर भरोसा करती हैं"। unsafePerformIO
एलेक्सी

मेरा वर्तमान समाधान (हास्केल में) एक शब्दकोश ( Mapऔर IntMap, या HashMap) को भंडारण के रूप में उपयोग करना है और नोड्स में लिंक किए गए नोड्स की आईडी है। "कंप्यूटर विज्ञान में सभी समस्याओं को एक अन्य स्तर के अप्रत्यक्ष रूप से हल किया जा सकता है।"
एलेक्सी

जवाबों:


6

अन्य कुशल अपरिवर्तनीय डेटा संरचनाएं हो सकती हैं जो आपके विशेष कार्य को फिट करती हैं, लेकिन एक दोगुनी-लिंक की गई सूची के रूप में सामान्य नहीं हैं (जो कि इसके उत्परिवर्तन के कारण दुर्भाग्य से समवर्ती संशोधन कीड़े होने का खतरा है )। यदि आप अपनी समस्या को अधिक संकीर्ण रूप से निर्दिष्ट करते हैं, तो ऐसी संरचना शायद मिल सकती है।

अपरिवर्तनीय संरचनाओं के लिए (अपेक्षाकृत) आर्थिक ट्रैवर्सिंग का सामान्य उत्तर लेंस है। विचार यह है कि आप अपने असंशोधित भागों और वर्तमान में संशोधित टुकड़े से एक संशोधित अपरिवर्तनीय संरचना का पुनर्निर्माण करने के लिए सिर्फ पर्याप्त जानकारी रख सकते हैं, और पड़ोसी नोड पर नेविगेट कर सकते हैं।

एक और उपयोगी संरचना एक जिपर है । (मज़ेदार हिस्सा यह है कि लेंस जिपर के लिए एक प्रकार का हस्ताक्षर संरचना के एक प्रकार के हस्ताक्षर का एक स्कूल-गणित व्युत्पन्न है।)

यहाँ कुछ लिंक दिए गए हैं।


1
क्या एक ज़िप की जरूरत है के आधार पर भी उपयोगी हो सकता है
jk।

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

1
@Alexey: क्या आप ग्राफ पुनर्लेखन पर स्वच्छ लोगों के काम से परिचित हैं? wiki.clean.cs.ru.nl/…
जियोर्जियो

1
@ एसेक्स: नहीं कि मुझे पता है: क्लीन हास्केल का एक चचेरा भाई है जो अपने आप विकसित हुआ था। इसके साइड-इफेक्ट्स से निपटने के लिए एक अलग तंत्र भी है (AFAIK इसे विशिष्ट प्रकार कहा जाता है)। दूसरी ओर, डेवलपर्स ने ग्राफ पुनर्लेखन के साथ बहुत काम किया है। इसलिए वे उन सर्वश्रेष्ठ लोगों में से हो सकते हैं, जो ग्राफ़ पुनर्लेखन और कार्यात्मक प्रोग्रामिंग दोनों के बारे में जानते हैं।
जियोर्जियो

1
मैं मानता हूं कि एक जिपर एक दोहरी लिंक की गई सूची या एक पेड़ के साथ समस्या को हल करने के लिए लगता है अगर मैं इसे नेविगेट करना चाहता हूं और वर्तमान में मैं जिस स्थान पर हूं, उसे संशोधित करना चाहता हूं, लेकिन यह स्पष्ट नहीं है कि क्या करना है अगर मैं कई स्थानों पर ध्यान केंद्रित करना चाहता हूं एक साथ और, उदाहरण के लिए, दो तत्वों को दो स्थानों पर दूर तक स्वैप करें। यह और भी कम स्पष्ट है यदि इसका उपयोग "परिपत्र" संरचनाओं के साथ किया जा सकता है।
एलेक्सी

2

हास्केल परस्पर डेटा संरचनाओं के उपयोग को नहीं रोकता है। इस तथ्य के कारण वे अत्यधिक हतोत्साहित और उपयोग करने में कठिन हो जाते हैं कि कोड के कुछ हिस्सों का उपयोग करने वाले को अंततः एक IO कार्रवाई (जो अंततः IO क्रिया में बाध्य होनी चाहिए जो मुख्य फ़ंक्शन द्वारा वापस लौटा दी जानी चाहिए), लेकिन ऐसा नहीं है यदि आपको वास्तव में उनकी आवश्यकता है तो ऐसी संरचनाओं का उपयोग करना असंभव है।

मैं आगे एक तरीके के रूप में सॉफ्टवेयर ट्रांसेक्शनल मेमोरी के उपयोग की जांच करने का सुझाव दूंगा। उत्परिवर्तनीय संरचनाओं को लागू करने के लिए एक कुशल तरीका प्रदान करने के साथ, यह थ्रेड-सुरक्षा के लिए बहुत उपयोगी गारंटी भी प्रदान करता है। Https://hackage.haskell.org/package/stm पर मॉड्यूल विवरण और https://wiki.haskell.org/Software_transactional_memory पर विकी अवलोकन देखें


धन्यवाद, मैं एसटीएम के बारे में जानने की कोशिश करूंगा। ऐसा लगता है कि वहाँ हास्केल में अधिक तरीकों अस्थिरता और राज्य (मैं पर stumbles है के लिए कर रहे हैं की तरह MVar, State, ST), तो मैं अपने मतभेदों को यह पता लगाने की जरूरत है और उपयोग करता है इरादा होगा।
एलेक्सी

@Alexey: STIMO के बारे में अच्छी बात है , इसका उत्तर में उल्लेख किया जाना चाहिए क्योंकि यह एक राज्य गणना को चलाने की अनुमति देता है, फिर राज्य को फेंक दें और परिणाम को शुद्ध मान के रूप में निकालें।
जियोर्जियो

@ जियोर्जियो, क्या एसकेएम के साथ हस्केल का उपयोग STकरना समवर्ती और डिस्पोजेबल राज्य दोनों के लिए संभव है ?
एलेक्सी

बस एक और शब्दावली का सुझाव: रचना की गई मुख्य IO क्रिया " मुख्य फ़ंक्शन द्वारा वापस नहीं" है, लेकिन mainचर को सौंपा गया है। :) ( mainएक फ़ंक्शन भी नहीं रखता है।)
एलेक्सी

मैं आपकी बात देख रहा हूं, लेकिन फिर भी "चर" में ज्यादातर लोगों के दिमाग में एक साधारण मूल्य के रूप में एक धारणा है, एक प्रक्रिया के बजाय जो एक मूल्य पैदा करता है, और मुख्य रूप से पूर्व के बजाय बाद के रूप में मुख्य रूप से बेहतर माना जाता है। स्पष्ट रूप से तकनीकी रूप से सही होने के दौरान, आपके द्वारा सुझाए गए परिवर्तन में विषय से अपरिचित लोगों को भ्रमित करने की क्षमता है।
जूल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.