अधिकांश कार्यात्मक भाषाएं अपनी प्राथमिक अपरिवर्तनीय डेटा संरचना के रूप में लिंक की गई सूचियों का उपयोग करती हैं। सूची क्यों, और उदाहरण के लिए पेड़ नहीं? पेड़ पथों का पुन: उपयोग भी कर सकते हैं, और यहां तक कि मॉडल सूची भी।
अधिकांश कार्यात्मक भाषाएं अपनी प्राथमिक अपरिवर्तनीय डेटा संरचना के रूप में लिंक की गई सूचियों का उपयोग करती हैं। सूची क्यों, और उदाहरण के लिए पेड़ नहीं? पेड़ पथों का पुन: उपयोग भी कर सकते हैं, और यहां तक कि मॉडल सूची भी।
जवाबों:
क्योंकि सूची पेड़ों की तुलना में सरल हैं। (आप इसे इस तथ्य से तुच्छ रूप से देख सकते हैं कि एक सूची एक पतित वृक्ष है, जहां प्रत्येक नोड में केवल एक ही बच्चा है।)
सामान्य सूची मनमाने आकार की सबसे सरल संभव पुनरावर्ती डेटा संरचना है।
गाइ स्टील ने किले की प्रोग्रामिंग भाषा के डिजाइन के दौरान तर्क दिया कि भविष्य की व्यापक समानांतर गणनाओं के लिए, हमारी डेटा संरचना और हमारे नियंत्रण प्रवाह दोनों को कई शाखाओं के साथ पेड़ के आकार का होना चाहिए, न कि रैखिक जैसा कि वे अब हैं। लेकिन कुछ समय के लिए, हमारे अधिकांश कोर डेटा संरचना पुस्तकालयों को अनुक्रमिक, पुनरावृत्ति प्रसंस्करण (या पूंछ पुनरावृत्ति के साथ डिज़ाइन किया गया था, यह वास्तव में कोई फर्क नहीं पड़ता है, वे समान चीज हैं), समानांतर प्रसंस्करण नहीं।
ध्यान दें कि क्लॉजोर में, जिनकी डेटा संरचनाएं विशेष रूप से समानांतर, वितरित, "बादल" आज की दुनिया के लिए डिज़ाइन की गई थीं , यहां तक कि सरणियां (क्लीजुरे में वैक्टर), शायद उन सभी की सबसे "रैखिक" डेटा संरचना, वास्तव में लागू होती हैं। पेड़।
तो, संक्षेप में: एक आम सूची सबसे सरल संभव लगातार डेटा संरचना है, और अधिक जटिल "डिफ़ॉल्ट" चुनने की आवश्यकता नहीं थी। अन्य विकल्प के रूप में निश्चित रूप से उपलब्ध हैं, उदाहरण के लिए हास्केल के पास सरणियाँ, प्राथमिकता कतारें, नक्शे, ढेर, ट्रेप्स, कोशिशें हैं, और सब कुछ जो आप संभवतः कल्पना कर सकते हैं, लेकिन डिफ़ॉल्ट सरल सामान्य सूची है।
data Tree a = Leaf a | Branch a (Tree a) (Tree a)
एस। यह आपके "सरलता" तर्क को पुष्ट करता है।
Sequence
या स्काला के Vector
) चाहते हैं, लेकिन पेड़ों का उपयोग नहीं करते हैं जब उन्हें केवल पढ़ने की आवश्यकता होती है क्योंकि वे सच्चे निरंतर समय में प्राप्त कर सकते हैं (जैसे हास्केल के Vector
या एफ के माध्यम से नेट का # ImmutableArray
)
pmap
क्लोजर में एक वेक्टर पर पिंग अभी भी प्रत्येक तत्व को क्रमिक रूप से एक्सेस करता है; वेक्टर की वृक्ष संरचना आम तौर पर अंतिम उपयोगकर्ता से छिपी होती है।
वास्तव में, उन सूचियों हैं पेड़! आपके पास दो फ़ील्ड के साथ नोड्स हैं, car
और cdr
, जिसमें अधिक ऐसे नोड्स या पत्तियां हो सकती हैं। केवल एक चीज जो उन पेड़ों को सूचियों में बनाती है, एक रैखिक सूची में अगले नोड के लिंक के रूप में लिंक की व्याख्या करने के लिए सम्मेलन है cdr
, और car
वर्तमान नोड के मूल्य के रूप में लिंक है।
उस ने कहा, मेरा अनुमान है कि कार्यात्मक प्रोग्रामिंग में लिंक की गई सूचियों का प्रसार पुनरावृत्ति के प्रसार से जुड़ा हुआ है। जब आपके हाथ में केवल लूपिंग निर्माण होता है (पूंछ-) पुनरावृत्ति, आप डेटा संरचनाएं चाहते हैं जो उस के साथ उपयोग करना आसान है; और लिंक की गई सूचियाँ उसके लिए एकदम सही हैं।