अपने अंतर्ज्ञान पा सकते हैं अपनी पीएचडी थीसिस का एक संशोधित संस्करण बिल्कुल सही दिशा आप सोच किया जाना चाहिए है। हालांकि, 'कॉपीिंग' बुद्धिमानी से हास्केल रनटाइम द्वारा कार्यान्वित किया गया। उदाहरण के लिए,
data Tree = Empty | Branch Tree Integer Tree
दिया आप बाईं शाखा को बदलने के लिए एक समारोह को लागू कर सकते हैं:
replaceLeft :: Tree -> Tree -> Tree
replaceLeft (Branch _ i r) newLeft = Branch newLeft i r
नतीजा यह है कि आप नए पेड़ की एक पूरी प्रतिलिपि बनाने के रूप में है कि नहीं है नहीं है ज़रूरी। मूल्य i
और पेड़ r
और newLeft
अपरिवर्तित हैं इसलिए हमें अपनी सामग्री को ताजा स्मृति में कॉपी करने की आवश्यकता नहीं है।
नई Branch
कि बनाई गई है (यह इस उदाहरण में केवल वास्तविक आवंटन है: संरचना Integer
पर बाईं/सही पेड़ धारण करने के लिए के निर्माण) अभी भी संदर्भ देता पुराने शाखा से ठीक उसी मान, कोई नकल जरूरत है!
चूंकि डेटा संरचनाएं अपरिवर्तनीय हैं, इसलिए ऐसा करने में कोई हानि नहीं है।
"इस प्रकार, वे वास्तव में \ 'चर' नहीं हैं" - निश्चित रूप से वे हैं। उदाहरण के लिए, जब एक गणितज्ञ कहता है "चलो * जी * समूह (* एस *, \ *) हो, जहां ...", * जी * एक चर है, भले ही यह कभी नहीं बदलेगा। हास्केल में यह वही सिद्धांत है। –
आप निश्चित रूप से एक दिलचस्प बिंदु उठाते हैं, वास्तव में संरचना प्रदर्शन को बलि किए बिना अपरिवर्तनीयता को समायोजित करने के लिए थोड़ा सा बदलती है। एक उन्मुख ग्राफ के रूप में अपनी संरचना के बारे में सोचें (जहां ए से बी के किनारे का अर्थ है कि ए को संदर्भ/सूचकांक बी है), फिर यदि आप बी को बदलना चाहते हैं, तो किसी भी वर्टेक्स से बी को सुलभ करने की आवश्यकता है और इसका संदर्भ अपडेट किया गया है । मुझे अभी भी पता नहीं है कि हास्केल में एक Skip सूची का प्रतिनिधित्व कैसे करें उदाहरण के लिए :) –