अपरिवर्तनशीलता या उत्परिवर्तन एक अवधारणा नहीं है जो कार्यात्मक प्रोग्रामिंग में समझ में आता है।
कम्प्यूटेशनल संदर्भ
यह एक बहुत अच्छा सवाल है जो हाल ही में एक के बाद एक दिलचस्प अनुवर्ती (डुप्लिकेट नहीं) है: असाइनमेंट, वैल्यूएशन और नाम बाइंडिंग के बीच अंतर क्या है?
इसके बजाय आपके बयानों का एक-एक करके जवाब देते हुए, मैं यहाँ कोशिश कर रहा हूँ कि आप एक संरचित अवलोकन दें जो कि दांव पर है।
आपको जवाब देने के लिए कई मुद्दों पर विचार किया जाना चाहिए, जिनमें शामिल हैं:
कम्प्यूटेशन का एक मॉडल क्या है, और क्या अवधारणाएं किसी दिए गए मॉडल के लिए समझ में आती हैं
आपके द्वारा उपयोग किए जा रहे शब्दों का क्या अर्थ है, और यह संदर्भ पर कैसे निर्भर करता है
कार्यात्मक प्रोग्रामिंग शैली मूर्खतापूर्ण लगती है क्योंकि आप इसे एक अनिवार्य प्रोग्रामर आंख के साथ देखते हैं। लेकिन यह एक अलग प्रतिमान है, और आपकी अनिवार्य अवधारणाएं और धारणा विदेशी हैं, जगह से बाहर हैं। संकलक के पास ऐसे कोई पूर्वाग्रह नहीं हैं।
लेकिन अंतिम निष्कर्ष यह है कि मशीन सीखने के लिए विशुद्ध रूप से कार्यात्मक तरीके से प्रोग्राम लिखना संभव है, सोचा कार्यात्मक प्रोग्रामिंग में डेटा संग्रहीत करने की अवधारणा नहीं है। मैं अन्य उत्तरों के साथ इस बिंदु पर असहमत लगता हूं।
उम्मीद है कि इस उत्तर की लंबाई के बावजूद कुछ दिलचस्पी लेंगे।
कम्प्यूटेशनल प्रतिमान
सवाल कार्यात्मक प्रोग्रामिंग (उर्फ एपेरेटिव प्रोग्रामिंग), कम्प्यूटेशन के एक विशिष्ट मॉडल के बारे में है, जिसका सैद्धांतिक और सरल प्रतिनिधि लंबोदर कैलकुलस है।
यदि आप एक सैद्धांतिक स्तर पर रहते हैं, तो कम्प्यूटेशन के कई मॉडल हैं: ट्यूरिंग मशीन (टीएम), रैम मशीन और अन्य , लैम्ब्डा कैलकुलस, कॉम्बिनेटर लॉजिक, रिकर्सिव फंक्शन थ्योरी, सेमी-थ्यू सिस्टम आदि। अधिक शक्तिशाली कम्प्यूटेशनल। मॉडल वे क्या संबोधित कर सकते हैं के संदर्भ में समान साबित हुए हैं, और यह चर्च-ट्यूरिंग थीसिस का सार है
।
एक महत्वपूर्ण अवधारणा मॉडल को एक-दूसरे के लिए कम कर रही है, जो चर्च-ट्यूरिंग थीसिस के लिए नेतृत्व करने वाले समकक्षों की स्थापना का आधार है। एक प्रोग्रामर के नजरिए से देखा गया, एक मॉडल को दूसरे से कम करना बहुत अधिक है जिसे आमतौर पर कंपाइलर कहा जाता है। यदि आप अपने कम्प्यूटेशन के मॉडल के रूप में लॉजिक प्रोग्रामिंग लेते हैं, तो यह आपके द्वारा किसी स्टोर में खरीदे गए पीसी द्वारा दिए गए मॉडल से काफी अलग है, और कंपाइलर लॉजिक प्रोग्रामिंग लैंग्वेज में लिखे गए प्रोग्राम को आपके पीसी द्वारा प्रस्तुत कम्प्यूटेशनल मॉडल में ट्रांसलेट करता है (बहुत अधिक RAM कंप्यूटर)।
हालांकि, इसका मतलब यह नहीं है कि दो मॉडल चीजों को एक ही तरीके से करते हैं, या कि एक के लिए सार्थक अवधारणा को दूसरे के रूप में स्थानांतरित किया जा सकता है। आमतौर पर, एक TM में एक संगणना कदम एक से थोड़ा संबंध हैβ- लैंबडा कैलकुलस में कमी कदम, हालांकि वे अंतर-अनुवाद योग्य हैं। टीएम मॉडल में जटिलता के मुद्दों से लैम्ब्डा अभिव्यक्ति के इष्टतम मूल्यांकन की अवधारणा काफी दूरस्थ है।
व्यवहार में, प्रोग्रामिंग भाषाएं जिनका उपयोग हम विभिन्न सैद्धांतिक उत्पत्ति से अवधारणाओं को मिलाने के लिए करते हैं, ऐसा करने की कोशिश कर रहे हैं ताकि कार्यक्रमों के चयनित हिस्से कुछ मॉडल के गुणों से लाभ उठा सकें जहां उपयुक्त हो। इसी तरह, लोग सिस्टम को अलग-अलग घटकों के लिए अलग-अलग भाषाओं का चयन कर सकते हैं, ताकि भाषा को हाथ से काम करने के लिए सबसे उपयुक्त बनाया जा सके।
इसलिए, आप शायद ही कभी एक प्रोग्रामिंग भाषा में शुद्ध अवस्था में एक प्रोग्रामिंग प्रतिमान देखते हैं। प्रोग्रामिंग भाषाओं को अभी भी प्रमुख प्रतिमान के अनुसार वर्गीकृत किया गया है, लेकिन भाषा के गुण प्रभावित हो सकते हैं जब अन्य प्रतिमानों से अवधारणाएं शामिल होती हैं, अक्सर अंतर और वैचारिक मुद्दों को धुंधला करती हैं।
आमतौर पर, हास्केल और एमएल या सीएएमएल जैसी भाषाओं को कार्यात्मक माना जाता है, लेकिन वे अनिवार्य व्यवहार की अनुमति दे सकते हैं ... और क्यों " विशुद्ध रूप से कार्यात्मक सबसेट " की बात करेंगे ?
फिर कोई यह दावा कर सकता है कि, आप यह या मेरी कार्यात्मक प्रोग्रामिंग भाषा में ऐसा कर सकते हैं, लेकिन यह वास्तव में कार्यात्मक प्रोग्रामिंग पर एक सवाल का जवाब नहीं दे रहा है जब यह अतिरिक्त-कार्यात्मक माना जा सकता है।
एक्स्ट्रा के बिना, उत्तर एक विशिष्ट प्रतिमान से अधिक सटीक रूप से संबंधित होना चाहिए।
एक चर क्या है?
एक अन्य समस्या शब्दावली का उपयोग है। गणित में एक चर एक इकाई है जो कुछ डोमेन में एक अनिर्धारित मूल्य के लिए खड़ा है। इसका उपयोग विभिन्न उद्देश्यों के लिए किया जाता है। एक समीकरण में उपयोग किया जाता है, यह जो कुछ भी मूल्य के लिए खड़ा हो सकता है जैसे कि समीकरण सत्यापित है। इस दृष्टि का उपयोग लॉजिक प्रोग्रामिंग में " लॉजिकल वैरिएबल " के नाम से किया जाता है , शायद इसलिए कि लॉजिक प्रोग्रामिंग के विकसित होने का नाम वेरिएबल पहले से ही था।
पारंपरिक अनिवार्य प्रोग्रामिंग में, एक चर को किसी प्रकार के कंटेनर (या मेमोरी लोकेशन) के रूप में समझा जाता है जो एक मूल्य के प्रतिनिधित्व को याद कर सकता है, और संभवतः इसके वर्तमान मूल्य को दूसरे के द्वारा बदल दिया जाता है)।
फंक्शनल प्रोग्रामिंग में, एक वैरिएबल का एक ही उद्देश्य होता है कि वह गणित में कुछ मूल्य के लिए एक स्थान-धारक के रूप में करता है, फिर भी प्रदान किया जाना है। पारंपरिक अनिवार्य प्रोग्रामिंग में यह भूमिका वास्तव में निरंतर द्वारा निभाई जाती है ( शाब्दिक रूप से भ्रमित न होने के लिए जो मानों के उस क्षेत्र के लिए एक संकेतन के साथ व्यक्त मूल्य निर्धारित किए जाते हैं, जैसे कि 123, सत्य, ["abdcz", 3.14])।
किसी भी प्रकार के चर, साथ ही साथ निरंतर, को पहचानकर्ताओं द्वारा दर्शाया जा सकता है।
अनिवार्यता परिवर्तनशील चर का मान बदल सकता है और यही परिवर्तनशीलता का आधार है। कार्यात्मक चर नहीं कर सकता।
प्रोग्रामिंग भाषाएं आमतौर पर बड़ी संस्थाओं के लिए भाषा में छोटे लोगों से निर्माण करने की अनुमति देती हैं।
इम्पीरेटिव भाषाएं ऐसे निर्माणों के लिए चर को शामिल करने की अनुमति देती हैं और यही आपको परस्पर डेटा देता है।
प्रोग्राम कैसे पढ़ें
एक कार्यक्रम मौलिक रूप से आपके एल्गोरिथ्म का एक अमूर्त विवरण है कुछ भाषा, चाहे एक व्यावहारिक डिजाइन हो, या एक सामान्य रूप से शुद्ध भाषा।
सिद्धांत रूप में, आप प्रत्येक कथन को ले सकते हैं कि इसका सार क्या है। तब कंपाइलर अनुवाद करेगा कि कंप्यूटर को निष्पादित करने के लिए कुछ उपयुक्त रूप में, लेकिन यह पहली बार में आपकी समस्या नहीं है।
बेशक, वास्तविकता थोड़ी कठोर है, और यह अक्सर अच्छा होता है कि कुछ ऐसा होता है जो संरचनाओं से बचने के लिए ऐसा होता है कि संकलक को यह पता नहीं चलेगा कि कुशल निष्पादन के लिए कैसे व्यवहार किया जाए। लेकिन यह पहले से ही अनुकूलन है ... जो संकलक प्रोग्रामर की तुलना में अक्सर बेहतर हो सकते हैं।
कार्यात्मक प्रोग्रामिंग और परिवर्तनशीलता
म्यूटेबिलिटी एसेबल वैरिएबल के अस्तित्व पर आधारित है जिसमें असाइनमेंट द्वारा बदले जा सकने वाले मान हो सकते हैं। चूंकि ये कार्यात्मक प्रोग्रामिंग में मौजूद नहीं हैं, इसलिए सब कुछ अपरिवर्तनीय के रूप में देखा जा सकता है।
Fuctional प्रोग्रामिंग विशेष रूप से मूल्यों के साथ संबंधित है।
अपरिवर्तनीयता पर आपके पहले चार कथन अधिकांशतः सही हैं, लेकिन अनिवार्य दृश्य के साथ कुछ ऐसा वर्णन करें जो अत्यावश्यक न हो। यह एक ऐसी दुनिया में रंगों के साथ वर्णन करने जैसा है जहां हर एक अंधा है। आप उन अवधारणाओं का उपयोग कर रहे हैं जो कार्यात्मक प्रोग्रामिंग के लिए विदेशी हैं।
आपके पास केवल शुद्ध मान हैं, और पूर्णांक का एक सरणी एक शुद्ध मूल्य है। एक और सरणी प्राप्त करने के लिए जो केवल एक तत्व में भिन्न है, आपको एक अलग सरणी मान का उपयोग करना होगा। एक तत्व को बदलना सिर्फ एक अवधारणा है जो इस संदर्भ में मौजूद नहीं है। आपके पास एक फ़ंक्शन हो सकता है जिसमें तर्क के रूप में एक सरणी और कुछ सूचकांक होते हैं, और एक परिणाम देता है जो लगभग समान सरणी है जो केवल सूचकांकों द्वारा इंगित किए गए भिन्न होते हैं। लेकिन यह अभी भी एक स्वतंत्र सरणी मूल्य है। इन मूल्य का प्रतिनिधित्व कैसे किया जाता है यह आपकी समस्या नहीं है। हो सकता है कि वे कंप्यूटर के लिए अनिवार्य अनुवाद में "साझा" करते हैं ... लेकिन यह कंपाइलर का काम है ... और आप यह भी नहीं जानना चाहते हैं कि यह किस तरह की मशीन वास्तुकला है।
आप मूल्यों की नकल नहीं करते हैं (यह कोई मतलब नहीं है, यह एक विदेशी अवधारणा है)। आप उन मानों का उपयोग करते हैं जो आपके प्रोग्राम में परिभाषित डोमेन में मौजूद हैं। या तो आप उनका वर्णन करते हैं (शाब्दिक के रूप में) या वे कुछ अन्य मूल्यों के लिए एक फ़ंक्शन लागू करने का परिणाम हैं। आप उन्हें यह सुनिश्चित करने के लिए एक नाम दे सकते हैं (इस प्रकार एक स्थिरांक को परिभाषित) कि कार्यक्रम में विभिन्न स्थानों में एक ही मूल्य का उपयोग किया जाता है। ध्यान दें कि फ़ंक्शन एप्लिकेशन को गणना के रूप में नहीं बल्कि दिए गए तर्कों के लिए आवेदन के परिणाम के रूप में माना जाना चाहिए। लिखने 5+2
या लिखने की 7
मात्रा। जो पिछले पैराग्राफ के अनुरूप है।
कोई आवश्यक चर नहीं हैं। कोई असाइनमेंट संभव नहीं है। आप नाम को केवल मूल्यों के लिए (स्थिरांक बनाने के लिए) बाध्य कर सकते हैं, अनिवार्य भाषाओं के विपरीत, जहाँ आप नामों को असाइन करने योग्य चर से बाँध सकते हैं।
चाहे जटिलता में एक लागत पूरी तरह से अस्पष्ट हो। एक चीज के लिए, आप जटिलता संबंधी चिंताओं के संदर्भ में हैं। इसे कार्यात्मक प्रोग्रामिंग के लिए परिभाषित नहीं किया जाता है, जब तक कि आप अपने कार्यात्मक कार्यक्रम को अनिवार्य के रूप में पढ़ना पसंद नहीं करते हैं, जो डिजाइनर का इरादा नहीं है। वास्तव में कार्यात्मक दृष्टिकोण आपको ऐसे मुद्दों के बारे में चिंता न करने और जो गणना की जा रही है उस पर ध्यान केंद्रित करने का इरादा है। यह विनिर्देश बनाम कार्यान्वयन जैसा है।
कंपाइलर को कार्यान्वयन का ध्यान रखना है, और सबसे अच्छा अनुकूल करने के लिए पर्याप्त स्मार्ट होना है कि हार्डवेयर को क्या करना है जो वह करेगा, जो भी हो।
मैं यह नहीं कह रहा हूं कि प्रोग्रामर कभी इस बारे में चिंता नहीं करते हैं। मैं यह भी नहीं कह रहा हूं कि प्रोग्रामिंग लैंग्वेज और कंपाइलर तकनीक उतनी ही परिपक्व हैं जितनी हम उन्हें बनने की इच्छा रख सकते हैं।
सवालों के जवाब दे रहे हैं
आप मौजूदा मूल्य (एलियन कॉन्सेप्ट) को संशोधित नहीं करते हैं, लेकिन नए मूल्यों की गणना करते हैं, जहां वांछित है, संभवतः एक अतिरिक्त तत्व होने से यह एक सूची है।
कार्यक्रम में नया डेटा मिल सकता है। पूरी बात यह है कि आप इसे भाषा में कैसे व्यक्त करते हैं। आप उदाहरण के लिए विचार कर सकते हैं कि कार्यक्रम एक विशिष्ट मूल्य के साथ काम करता है, संभवतः आकार में अनबाउंड, जिसे इनपुट स्ट्रीम कहा जाता है। यह एक ऐसा मूल्य है जो माना जाता है कि वह वहां बैठा है (चाहे वह पहले से ही पूरी तरह से जाना जाता है या आपकी समस्या नहीं है)। फिर आपके पास एक फ़ंक्शन होता है जो स्ट्रीम के पहले तत्व और शेष स्ट्रीम से बना एक जोड़ी देता है।
आप उपयोग कर सकते हैं कि संचार उपकरणों के नेटवर्क को शुद्ध रूप से लागू करने के तरीके (कोराउटाइन) में
मशीन लर्निंग एक और समस्या है जब आपको डेटा को एक्सेप्ट करना है और वैल्यूज को मॉडिफाई करना है। कार्यात्मक प्रोग्रामिंग में आप ऐसा नहीं करते हैं: आप बस नए मूल्यों की गणना करते हैं जो प्रशिक्षण डेटा के अनुसार उचित रूप से भिन्न होते हैं। परिणामस्वरूप मशीन भी काम करेगी। आपको जिस चीज की चिंता है, वह है समय और अंतरिक्ष दक्षता की गणना करना। लेकिन, फिर से, यह एक अलग मुद्दा है, कि आदर्श रूप से संकलक द्वारा निपटा जाना चाहिए।
अंतिम टिप्पणी
यह स्पष्ट है, टिप्पणियों या अन्य उत्तरों से, व्यावहारिक व्यावहारिक प्रोग्रामिंग भाषा विशुद्ध रूप से कार्यात्मक नहीं हैं। यह इस तथ्य पर एक प्रतिबिंब है कि हमारी तकनीक में अभी भी सुधार किया जाना है, खासकर जहां संकलन का संबंध है।
क्या विशुद्ध रूप से प्रयोजनीय शैली में लिखना संभव है? उत्तर को लगभग 40 वर्षों से जाना जाता है और यह "हाँ" है। 1970 के दशक में दिखाई देने वाले शब्दार्थिक शब्दार्थ का बहुत ही उद्देश्य विशुद्ध रूप से कार्यात्मक शैली में भाषाओं का अनुवाद (संकलन) करना था, जिन्हें गणितीय रूप से बेहतर समझा जाता था और इस प्रकार कार्यक्रमों के शब्दार्थ को परिभाषित करने के लिए एक बेहतर कोष माना जाता था।
दिलचस्प पहलू ओटी यह है कि वैरिएबल प्रोग्रामिंग संरचना, जिसमें चर भी शामिल हैं, को एक कार्यात्मक शैली में अनुवाद किया जा सकता है, जिसमें मानों के उपयुक्त डोमेन, जैसे डेटा स्टोर शुरू किया जा सकता है। और कार्यात्मक शैली के बावजूद, यह आश्चर्यजनक रूप से अनिवार्य शैली में लिखे गए वास्तविक संकलक के कोड के समान है।