यह कार्यात्मक प्रोग्रामिंग के बारे में एक सामान्य सवाल है, लेकिन मुझे यह भी रूचि है कि विशिष्ट भाषाओं में इसका क्या जवाब है।गैर-लगातार डेटा संरचनाओं को पूरी तरह कार्यात्मक तरीके से उपयोग किया जा सकता है?
मेरे पास केवल कार्यात्मक भाषाओं के बारे में शुरुआती ज्ञान है, इसलिए मेरे साथ भालू।
यह मेरी समझ है कि कार्यात्मक भाषाएं अनिवार्य भाषाओं की तुलना में विभिन्न डेटा संरचनाओं पर ध्यान केंद्रित करती हैं, क्योंकि वे अपरिवर्तनीयता पसंद करते हैं: लगातार डेटा संरचनाएं।
उदाहरण के लिए, वे सब एक अपरिवर्तनीय सूची अवधारणा है जहाँ आप एक नई सूचियों x :: l
और y :: l
किसी मौजूदा सूची l
और दो नए x
और y
कॉपी किया जा करने की जरूरत के l
के सभी तत्वों के बिना आइटम से फार्म कर सकते हैं। यह संभावित रूप से पुराने सूची को पूंछ के रूप में इंगित करने वाली नई सूची वस्तु द्वारा कार्यान्वित किया जाता है।
अनिवार्य भाषाओं में, ऐसी डेटा संरचना का शायद ही कभी उपयोग किया जाता है, क्योंकि वे सी-स्टाइल सरणी के रूप में संदर्भ के अच्छे इलाके के रूप में प्रदान नहीं करते हैं।
सामान्य रूप से, कार्यात्मक शैली का समर्थन करने वाले डेटा संरचनाओं को ढूंढना अपने आप का एक प्रयास है, इसलिए यह बहुत अच्छा होगा अगर किसी को हमेशा ऐसा नहीं करना पड़ेगा।
अब यहां एक विचार है कि यदि कोई इसके लिए सही भाषा समर्थन है तो कोई कार्यात्मक प्रोग्रामिंग में सभी शास्त्रीय डेटा संरचनाओं का उपयोग कैसे कर सकता है।
सामान्य तौर पर, एक अनिवार्य भाषा में एक डेटा संरचना है आपरेशनों उस पर परिभाषित (छद्म कोड में) को संशोधित:
data.modify(someArgument)
इस लेखन के कार्यात्मक तरीका है
newData = modified(data, someArgument)
सामान्य
समस्या यह है कि इसे सामान्य रूप से डेटा संरचना की प्रतिलिपि बनाने की आवश्यकता होती है - सिवाय इसके कि अगर भाषा को पता चल सके कि data
वास्तव में किसी और चीज द्वारा उपयोग नहीं किया जाएगा: फिर, संशोधन को मूल रूप से म्यूट करने के रूप में किया जा सकता है और कोई भी अलग नहीं बता सकता सम्मेलन।
ऐसे मामले भाषा के "कहीं और इस्तेमाल कभी नहीं" है कि संपत्ति का अनुमान लगा सकता है का एक बड़ा वर्ग है: जब modified
को पहले तर्क, एक अबाध मूल्य है इस उदाहरण में है:
newData = modified(modified(data, someArgument))
यहाँ, data
कहीं और इस्तेमाल किया जा सकता है, लेकिन modified(data, someArgument)
स्पष्ट रूप से नहीं है।
सी ++ में यह "रेवल्यू" कहा जाता है, और सी ++ के नवीनतम अवतार में, जो विडंबनात्मक रूप से अन्यथा कार्यात्मक नहीं है, कोई भी ऐसे राक्षसों पर अधिभारित कर सकता है।
उदाहरण के लिए, एक लिख सकते हैं:
Data modified(Data const& data) { // returns a modified copy }
Data modified(Data && data) { // returns the modified original }
इसका मतलब है कि सी ++ में, एक वास्तव में किसी भी परिवर्तनशील कुशल डेटा संरचना लेने के लिए और यह एक अपरिवर्तनीय एपीआई है कि एक पूरी तरह कार्यात्मक में इस्तेमाल किया जा सकता करने के लिए परिवर्तित कर सकते हैं अनिवार्य रूप से अनिवार्य रूप से आवश्यक संस्करण के रूप में रास्ता होगा।
(यह चेतावनी है कि सी ++ में कभी-कभी कास्टिंग ओवरलोड को मजबूर करने के लिए कभी-कभी कास्टिंग आवश्यक होता है। और इस तरह के डेटा संरचनाओं को लागू करने पर निश्चित रूप से देखभाल की आवश्यकता होती है, यानी रावल्यू ओवरलोड का उपयोग करते समय। यह शायद बेहतर हो सकता है हालांकि पर)
अब मेरे सवाल:।
क्या वास्तविक कार्यात्मक भाषाओं के लिए एक समान तंत्र है? या यह किसी अन्य कारण के लिए जरूरी नहीं है?
)
संभावित डुप्लिकेट [हास्केल में जटिल डेटा संरचनाएं - वे कैसे काम करते हैं?] (Http://stackoverflow.com/questions/4597262/complex-data-structures-in-haskell-how-do-they-work) – duplode
@ डुप्लोड आपने वास्तव में प्रश्न नहीं पढ़ा, है ना? – John
आप सही हैं, वास्तव में: यह एक डुप्लिकेट नहीं है, और मैंने अपना करीबी वोट वापस ले लिया। हालांकि सवाल के लिए निष्क्रिय आक्रामक संपादन करने की कोई आवश्यकता नहीं है - यह सब कुछ गलती को इंगित करता है (इस मामले में, मेरी गलती) स्पष्ट रूप से। किसी भी मामले में: (1) यदि आप किसी अन्य कारण के लिए "[जिस चाल का उल्लेख करते हैं] आवश्यक नहीं है, तो आप इस बारे में अधिक जानना चाहते हैं कि मैं उपयोगी से जुड़े प्रश्न में संदर्भ पा सकता हूं। (2) वर्तमान में तीन "बहुत व्यापक" करीबी वोट हैं, जो मुझे नहीं लगता कि वे उचित हैं (शायद एक और विशिष्ट शीर्षक आगे गलतफहमी से बचने में मदद करेगा)। – duplode