Recently मैं this OCaml code पेश किया गया था जो हास्केल में के रूप में लिखा जा सकता है नोड्स की साझेदारी:"सही" शुद्ध कार्यात्मक दोगुना से जुड़े सूची और
data DL a = DL [a] a [a]
create [] = error "empty list"
create (x:xs) = DL [] x xs
next (DL pr x (h:tl)) = DL (x:pr) h tl
next _ = error "end of dlist"
prev (DL (p:pr) x tl) = DL pr p (x:tl)
prev _ = error "start of dlist"
जो मैं हालांकि था नहीं एक उचित दोगुना से जुड़े सूची कार्यान्वयन, क्योंकि यह ट्रैवर्सल पर नया भंडारण बनाता है। OTOH वहाँ this Haskell code है:
data DList a = Leaf | Node { prev::(DList a), elt::a, next::(DList a) }
create = go Leaf
where go _ [] = Leaf
go prev (x:xs) = current
where current = Node prev x next
next = go current xs
हम कह सकते हैं कि यह केवल इस कोड है कि सच डीएल-सूची है?
क्या हम डीएल-सूची के नोड्स के सही साझाकरण को प्रस्तुत करने के लिए इस कोड पर भरोसा कर सकते हैं, ताकि ट्रैवर्सल पर कोई नया संग्रहण नहीं बनाया जा सके?
हास्केल में समान नाम वाले चर हमेशा एक ही "बात"की चर्चा करते हुए है या समान नाम वाले चर एक ही बात की अलग प्रति को देखें की घटनाओं को अलग कर सकते हैं? (जोर जोड़ने के लिए संपादित)।
पहला कार्यान्वयन जिसे _Zipper_ के नाम से जाना जाता है; तर्कसंगत रूप से यह अकेले या दोगुनी-लिंक्ड सूचियों के लिए हो सकता है। हालांकि, यह अपने अधिकार में एक सूची कार्यान्वयन नहीं है। – ivanm
यदि आप सावधानी से हास्केल रिपोर्ट पढ़ते हैं, तो आपको डेटा का प्रतिनिधित्व करने के तरीके पर एक अनुच्छेद नहीं मिल रहा है। ध्यान रखें, कि सभी प्रकार की साझाकरण कार्यान्वयन पर निर्भर है, हालांकि कुछ निश्चित सुविधाओं को लागू करने के लिए केवल कुछ समझदार तरीके हैं। – fuz
इस प्रश्न के लिए धन्यवाद! मैं इसके साथ देखकर संतुष्ट नहीं हूं। – demi