क्या कार्यात्मक प्रोग्रामिंग में अपरिवर्तनीयता वास्तव में मौजूद है?


9

हालांकि मैं अपने दैनिक जीवन में एक प्रोग्रामर के रूप में काम करता हूं और सभी ट्रेंडी भाषाओं (पायथन, जावा, सी, आदि) का उपयोग करता हूं। मेरे पास अभी भी कोई स्पष्ट दृष्टिकोण नहीं है कि कार्यात्मक प्रोग्रामिंग क्या है। मैंने जो पढ़ा है, उसमें से कार्यात्मक भाषाओं की एक संपत्ति यह है कि डेटा संरचनाएं अपरिवर्तनीय हैं । मेरे लिए यह अकेले बहुत सारे सवाल खड़े करता है। लेकिन पहले मैं थोड़ा सा लिखूंगा कि मैं अपरिवर्तनीयता के बारे में क्या समझता हूं और अगर मैं गलत हूं, तो मुझे सुधारने के लिए स्वतंत्र महसूस करें।

अपरिवर्तनीयता के बारे में मेरी समझ:

  • जब कोई प्रोग्राम शुरू होता है तो इसमें निश्चित डेटा के साथ डेटा संरचनाएं होती हैं
  • कोई इन संरचनाओं में नया डेटा नहीं जोड़ सकता है
  • कोड में कोई चर नहीं हैं
  • आप पहले से मौजूद डेटा या वर्तमान में गणना किए गए डेटा से "कॉपी" कर सकते हैं
  • उपरोक्त सभी के कारण, अपरिवर्तनीयता एक कार्यक्रम में विशाल स्थान जटिलता जोड़ती है

मेरे सवाल:

  1. यदि डेटा संरचनाओं को माना जाता है कि वे (अपरिवर्तनीय) हैं, तो कोई व्यक्ति किसी सूची में नया आइटम कैसे जोड़ सकता है?
  2. एक कार्यक्रम है कि नए डेटा नहीं मिल सकता है में क्या बात है? कहें कि आपके पास आपके कंप्यूटर से जुड़ा एक सेंसर है जो प्रोग्राम को डेटा फीड करना चाहता है। इसका मतलब यह होगा कि हम आने वाले डेटा को कहीं भी स्टोर नहीं कर सकते हैं?
  3. उस मामले में मशीन सीखने के लिए कार्यात्मक प्रोग्रामिंग कैसे अच्छा है? चूँकि मशीन लर्निंग प्रोग्राम की चीजों की "धारणा" को अपडेट करने की धारणा से बनता है - इस प्रकार नए डेटा को संग्रहित करता है।

2
जब आप कहते हैं कि कार्यात्मक कोड में कोई चर नहीं हैं, तो मैं आपसे असहमत हूं। "एक मात्रा जो मानों के सेट में से किसी एक को मान सकती है" के गणितीय अर्थ में चर हैं। वे उत्परिवर्तित , निश्चित नहीं हैं , लेकिन न तो वे गणित में हैं।
एडवर्ड

1
मुझे लगता है कि आपका भ्रम इसलिए है क्योंकि आप कार्यात्मक भाषाओं के बारे में सोच रहे हैं। बस हास्केल में किसी भी कार्यक्रम को ले लो - उदाहरण के लिए एक प्रोग्राम जो कंसोल से संख्याओं की एक सूची पढ़ता है, इसे त्वरित-टाइप करता है और इसे आउटपुट करता है - और यह पता लगाता है कि यह कैसे काम करता है और यह आपके संदेह को कैसे बाधित करता है। दार्शनिकता के बजाय वास्तविक कार्यक्रमों के उदाहरणों को देखे बिना वास्तव में चीजों को स्पष्ट करने का कोई तरीका नहीं है। आपको किसी भी हास्केल ट्यूटोरियल में बहुत सारे प्रोग्राम मिलेंगे।
19

@jkff आप क्या कहना चाह रहे हैं? उस हास्केल में गैर-कार्यात्मक विशेषताएं हैं। प्रश्न हास्केल के बारे में नहीं है, लेकिन कार्यात्मक प्रोग्रामिंग के बारे में है। या आप यह कह रहे हैं कि यह सब कार्यात्मक है? कैसे? तो आपको दार्शनिकता में क्या गलत होना चाहिए, जैसा कि आप कहते हैं। किस तरह से अमूर्त भ्रमित है? ओपी प्रश्न एक बहुत ही समझदार है।
Babou

@babou मैं यह कहने की कोशिश कर रहा हूं कि यह समझने का सबसे अच्छा तरीका है कि एक विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषा कुशलता से एल्गोरिदम को कैसे लागू कर सकती है और डेटा संरचनाओं को कार्यात्मक प्रोग्रामिंग भाषा में कुशलता से लागू किए गए एल्गोरिदम और डेटा संरचनाओं के उदाहरणों को देखना है। यह मुझे लगता है कि ओपी यह समझने की कोशिश कर रहा था कि यह वैचारिक रूप से कैसे संभव है - मुझे लगता है कि समझने का सबसे तेज़ तरीका उदाहरणों को देखना है, न कि वैचारिक स्पष्टीकरण को पढ़ना, चाहे वह कितना भी विस्तृत क्यों न हो।
jkff

कार्यात्मक प्रोग्रामिंग को देखने का एक तरीका यह है कि यह साइड इफेक्ट के बिना प्रोग्रामिंग है। आप अपनी पसंद की "ट्रेंडी" भाषा में ऐसा कर सकते हैं। बस सभी पुनर्मूल्यांकन से बचें: जैसे कि जावा में, आपके सभी चर अंतिम होंगे और आपके सभी तरीके केवल-पढ़ने के लिए होंगे।
रीइनियरियरपोस्ट

जवाबों:


10

जब कोई प्रोग्राम शुरू होता है तो इसमें निश्चित डेटा के साथ डेटा संरचनाएं होती हैं

यह एक गलत धारणा है। इसका एक निश्चित रूप और फिर से लिखना नियमों का एक निश्चित सेट है, लेकिन ये पुनर्लेखन नियम कुछ अधिक बड़े विस्फोट कर सकते हैं। उदाहरण के लिए हास्केल में अभिव्यक्ति [1..100000000] को बहुत कम मात्रा में कोड द्वारा दर्शाया जाता है, लेकिन इसका सामान्य रूप बड़े पैमाने पर है।

कोई इन संरचनाओं में नया डेटा नहीं जोड़ सकता है

हां और ना। हास्केल या एमएल जैसी भाषा का विशुद्ध रूप से कार्यात्मक उपसमूह बाहरी दुनिया से डेटा प्राप्त नहीं कर सकता है, लेकिन व्यावहारिक प्रोग्रामिंग के लिए किसी भी भाषा में बाहरी दुनिया से डेटा को पूरी तरह कार्यात्मक उपसमुच्चय में सम्मिलित करने के लिए एक तंत्र है। हास्केल में यह बहुत सावधानी से किया जाता है लेकिन एमएल में आप जब चाहें तब ऐसा कर सकते हैं।

कोड में कोई चर नहीं हैं

यह बहुत सच है, लेकिन इस विचार के साथ भ्रमित मत करो कि कुछ भी नाम नहीं दिया जा सकता है। आप हर समय उपयोगी अभिव्यक्तियों को नाम देते हैं और लगातार उनका उपयोग करते हैं। एमएल और हास्केल दोनों, हर लिस्प मैंने कोशिश की है, और स्काला जैसे संकर, सभी के पास चर बनाने का एक साधन है। वे आमतौर पर उपयोग नहीं किए जाते हैं। और फिर से ऐसी भाषाओं के विशुद्ध रूप से कार्यात्मक उपसमूह उनके पास नहीं हैं।

आप पहले से मौजूद डेटा या वर्तमान में गणना किए गए डेटा से "कॉपी" कर सकते हैं

आप सामान्य रूप में कमी करके गणना कर सकते हैं। वास्तव में यह करने के लिए सबसे अच्छी बात यह है कि एक कार्यात्मक भाषा में प्रोग्राम लिखने के लिए यह देखने के लिए कि वे वास्तव में गणना कैसे करते हैं।

उदाहरण के लिए "योग [1..1000]" एक गणना नहीं है जिसे मैं प्रदर्शन करना चाहता हूं, लेकिन यह हास्केल द्वारा काफी कुशलता से किया गया है। हमने इसे एक छोटी अभिव्यक्ति दी, जिसका हमारे लिए अर्थ था और हास्केल ने हमें इसी संख्या से बाहर कर दिया। तो यह निश्चित रूप से गणना करता है।

यदि डेटा संरचनाओं को माना जाता है कि वे (अपरिवर्तनीय) हैं, तो कोई व्यक्ति किसी सूची में नया आइटम कैसे जोड़ सकता है?

आप एक सूची में एक नया आइटम नहीं जोड़ते हैं, आप पुराने से एक नई सूची बनाते हैं। क्योंकि पुराने को उत्परिवर्तित नहीं किया जा सकता है, नई सूची में इसका उपयोग करना पूरी तरह से सुरक्षित है, या जहां भी आप चाहते हैं। इस स्कीमा में बहुत अधिक डेटा सुरक्षित रूप से साझा किया जा सकता है।

एक कार्यक्रम है कि नए डेटा नहीं मिल सकता है में क्या बात है? कहें कि आपके पास आपके कंप्यूटर से जुड़ा एक सेंसर है जो प्रोग्राम को डेटा फीड करना चाहता है। इसका मतलब यह होगा कि हम आने वाले डेटा को कहीं भी स्टोर नहीं कर सकते हैं?

जहाँ तक उपयोगकर्ता इनपुट जाता है, किसी भी व्यावहारिक प्रोग्रामिंग भाषा में उपयोगकर्ता इनपुट प्राप्त करने का एक तरीका है। ऐसा होता है। हालाँकि इन भाषाओं का एक पूर्ण कार्यात्मक उपसमुच्चय है जिसे आप अपना अधिकांश कोड लिखते हैं और आप इस तरह से लाभ उठाते हैं।

उस मामले में मशीन सीखने के लिए कार्यात्मक प्रोग्रामिंग कैसे अच्छा है? चूँकि मशीन लर्निंग प्रोग्राम की चीजों की "धारणा" को अपडेट करने की धारणा से बनता है - इस प्रकार नए डेटा को संग्रहित करता है।

यह सक्रिय सीखने के लिए मामला होगा, लेकिन अधिकांश मशीन सीखने के साथ मैंने काम किया है (मैं मशीन सीखने वाले समूह में कोड बंदर के रूप में काम करता हूं और कुछ वर्षों के लिए ऐसा किया है) एक बार सीखने की प्रक्रिया है जहां सभी प्रशिक्षण डेटा लोड किए जाते हैं एक बार में लेकिन सक्रिय सीखने के लिए आप चीजों को शुद्ध रूप से 100% नहीं कर सकते। आपको बाहरी दुनिया के कुछ डेटा पढ़ने होंगे।


मुझे ऐसा लगता है कि आपने सुविधाजनक रूप से अनदेखा कर दिया है, जो निश्चित रूप से @ पिथिकोस के पोस्ट में सबसे महत्वपूर्ण बिंदु हो सकता है, जो कि अंतरिक्ष का मुद्दा है - कार्यात्मक कार्यक्रम आवधिक लोगों की तुलना में अधिक स्थान का उपयोग करते हैं (आप इन-प्लेस एल्गोरिदम और इस तरह नहीं लिख सकते हैं)
user54169

2
यह बस सच नहीं है। म्यूटेशन की कमी काफी हद तक साझा करने के लिए बनी है और इन सभी को शीर्ष पर लाने के लिए आपके द्वारा निर्दिष्ट आकार अंतर आधुनिक कंपाइलरों के साथ छोटा है। हैस्केल में सूचियों का अधिकांश कोड जगह-जगह पर अस्पष्ट है या बिना किसी मेमोरी के उपयोग करता है।
जेक

1
मुझे लगता है कि आप एमएल को कुछ हद तक गलत ठहरा रहे हैं। हां, I / O कहीं भी हो सकता है, लेकिन मौजूदा संरचनाओं में नई जानकारी को जिस तरह से पेश किया जाता है, उसे कसकर नियंत्रित किया जाता है।
dfeuer

@Pithikos, सभी जगह चर हैं; वे बस से अलग हैं जो आप के आदी हैं, जैसा कि indicateddouard ने संकेत दिया है। और चीजें लगातार आवंटित की जा रही हैं और कचरा एकत्र किया जा रहा है। एक बार जब आप वास्तव में कार्यात्मक प्रोग्रामिंग में शामिल हो जाते हैं, तो आप बेहतर समझ पाएंगे कि यह वास्तव में कैसे चलता है।
Dfeuer

1
यह सच है कि ऐसे एल्गोरिदम मौजूद हैं जिनका विशुद्ध रूप से ज्ञात कार्यान्वयन के रूप में एक ही समय जटिलता के साथ कोई विशुद्ध रूप से कार्यात्मक कार्यान्वयन नहीं है - उदाहरण के लिए यूनियन-फाइंड डेटास्ट्रक्चर (और, um, arrays :)) मुझे लगता है कि अंतरिक्ष में भी इस तरह के मामले हैं जटिलता। लेकिन ये अपवाद हैं - अधिकांश सामान्य एल्गोरिदम / डेटास्ट्रक्चर में समान समय और स्थान की जटिलता के साथ कार्यान्वयन हैं। यह प्रोग्रामिंग स्टाइल और (कंपाइलर की गुणवत्ता का एक स्थिर कारक) का एक व्यक्तिपरक मामला है।
19

4

अपरिवर्तनशीलता या उत्परिवर्तन एक अवधारणा नहीं है जो कार्यात्मक प्रोग्रामिंग में समझ में आता है।

कम्प्यूटेशनल संदर्भ

यह एक बहुत अच्छा सवाल है जो हाल ही में एक के बाद एक दिलचस्प अनुवर्ती (डुप्लिकेट नहीं) है: असाइनमेंट, वैल्यूएशन और नाम बाइंडिंग के बीच अंतर क्या है?

इसके बजाय आपके बयानों का एक-एक करके जवाब देते हुए, मैं यहाँ कोशिश कर रहा हूँ कि आप एक संरचित अवलोकन दें जो कि दांव पर है।

आपको जवाब देने के लिए कई मुद्दों पर विचार किया जाना चाहिए, जिनमें शामिल हैं:

  • कम्प्यूटेशन का एक मॉडल क्या है, और क्या अवधारणाएं किसी दिए गए मॉडल के लिए समझ में आती हैं

  • आपके द्वारा उपयोग किए जा रहे शब्दों का क्या अर्थ है, और यह संदर्भ पर कैसे निर्भर करता है

कार्यात्मक प्रोग्रामिंग शैली मूर्खतापूर्ण लगती है क्योंकि आप इसे एक अनिवार्य प्रोग्रामर आंख के साथ देखते हैं। लेकिन यह एक अलग प्रतिमान है, और आपकी अनिवार्य अवधारणाएं और धारणा विदेशी हैं, जगह से बाहर हैं। संकलक के पास ऐसे कोई पूर्वाग्रह नहीं हैं।

लेकिन अंतिम निष्कर्ष यह है कि मशीन सीखने के लिए विशुद्ध रूप से कार्यात्मक तरीके से प्रोग्राम लिखना संभव है, सोचा कार्यात्मक प्रोग्रामिंग में डेटा संग्रहीत करने की अवधारणा नहीं है। मैं अन्य उत्तरों के साथ इस बिंदु पर असहमत लगता हूं।

उम्मीद है कि इस उत्तर की लंबाई के बावजूद कुछ दिलचस्पी लेंगे।

कम्प्यूटेशनल प्रतिमान

सवाल कार्यात्मक प्रोग्रामिंग (उर्फ एपेरेटिव प्रोग्रामिंग), कम्प्यूटेशन के एक विशिष्ट मॉडल के बारे में है, जिसका सैद्धांतिक और सरल प्रतिनिधि लंबोदर कैलकुलस है।

यदि आप एक सैद्धांतिक स्तर पर रहते हैं, तो कम्प्यूटेशन के कई मॉडल हैं: ट्यूरिंग मशीन (टीएम), रैम मशीन और अन्य , लैम्ब्डा कैलकुलस, कॉम्बिनेटर लॉजिक, रिकर्सिव फंक्शन थ्योरी, सेमी-थ्यू सिस्टम आदि। अधिक शक्तिशाली कम्प्यूटेशनल। मॉडल वे क्या संबोधित कर सकते हैं के संदर्भ में समान साबित हुए हैं, और यह चर्च-ट्यूरिंग थीसिस का सार है ।

एक महत्वपूर्ण अवधारणा मॉडल को एक-दूसरे के लिए कम कर रही है, जो चर्च-ट्यूरिंग थीसिस के लिए नेतृत्व करने वाले समकक्षों की स्थापना का आधार है। एक प्रोग्रामर के नजरिए से देखा गया, एक मॉडल को दूसरे से कम करना बहुत अधिक है जिसे आमतौर पर कंपाइलर कहा जाता है। यदि आप अपने कम्प्यूटेशन के मॉडल के रूप में लॉजिक प्रोग्रामिंग लेते हैं, तो यह आपके द्वारा किसी स्टोर में खरीदे गए पीसी द्वारा दिए गए मॉडल से काफी अलग है, और कंपाइलर लॉजिक प्रोग्रामिंग लैंग्वेज में लिखे गए प्रोग्राम को आपके पीसी द्वारा प्रस्तुत कम्प्यूटेशनल मॉडल में ट्रांसलेट करता है (बहुत अधिक RAM कंप्यूटर)।

हालांकि, इसका मतलब यह नहीं है कि दो मॉडल चीजों को एक ही तरीके से करते हैं, या कि एक के लिए सार्थक अवधारणा को दूसरे के रूप में स्थानांतरित किया जा सकता है। आमतौर पर, एक TM में एक संगणना कदम एक से थोड़ा संबंध हैβ- लैंबडा कैलकुलस में कमी कदम, हालांकि वे अंतर-अनुवाद योग्य हैं। टीएम मॉडल में जटिलता के मुद्दों से लैम्ब्डा अभिव्यक्ति के इष्टतम मूल्यांकन की अवधारणा काफी दूरस्थ है।

व्यवहार में, प्रोग्रामिंग भाषाएं जिनका उपयोग हम विभिन्न सैद्धांतिक उत्पत्ति से अवधारणाओं को मिलाने के लिए करते हैं, ऐसा करने की कोशिश कर रहे हैं ताकि कार्यक्रमों के चयनित हिस्से कुछ मॉडल के गुणों से लाभ उठा सकें जहां उपयुक्त हो। इसी तरह, लोग सिस्टम को अलग-अलग घटकों के लिए अलग-अलग भाषाओं का चयन कर सकते हैं, ताकि भाषा को हाथ से काम करने के लिए सबसे उपयुक्त बनाया जा सके।

इसलिए, आप शायद ही कभी एक प्रोग्रामिंग भाषा में शुद्ध अवस्था में एक प्रोग्रामिंग प्रतिमान देखते हैं। प्रोग्रामिंग भाषाओं को अभी भी प्रमुख प्रतिमान के अनुसार वर्गीकृत किया गया है, लेकिन भाषा के गुण प्रभावित हो सकते हैं जब अन्य प्रतिमानों से अवधारणाएं शामिल होती हैं, अक्सर अंतर और वैचारिक मुद्दों को धुंधला करती हैं।

आमतौर पर, हास्केल और एमएल या सीएएमएल जैसी भाषाओं को कार्यात्मक माना जाता है, लेकिन वे अनिवार्य व्यवहार की अनुमति दे सकते हैं ... और क्यों " विशुद्ध रूप से कार्यात्मक सबसेट " की बात करेंगे ?

फिर कोई यह दावा कर सकता है कि, आप यह या मेरी कार्यात्मक प्रोग्रामिंग भाषा में ऐसा कर सकते हैं, लेकिन यह वास्तव में कार्यात्मक प्रोग्रामिंग पर एक सवाल का जवाब नहीं दे रहा है जब यह अतिरिक्त-कार्यात्मक माना जा सकता है।

एक्स्ट्रा के बिना, उत्तर एक विशिष्ट प्रतिमान से अधिक सटीक रूप से संबंधित होना चाहिए।

एक चर क्या है?

एक अन्य समस्या शब्दावली का उपयोग है। गणित में एक चर एक इकाई है जो कुछ डोमेन में एक अनिर्धारित मूल्य के लिए खड़ा है। इसका उपयोग विभिन्न उद्देश्यों के लिए किया जाता है। एक समीकरण में उपयोग किया जाता है, यह जो कुछ भी मूल्य के लिए खड़ा हो सकता है जैसे कि समीकरण सत्यापित है। इस दृष्टि का उपयोग लॉजिक प्रोग्रामिंग में " लॉजिकल वैरिएबल " के नाम से किया जाता है , शायद इसलिए कि लॉजिक प्रोग्रामिंग के विकसित होने का नाम वेरिएबल पहले से ही था।

पारंपरिक अनिवार्य प्रोग्रामिंग में, एक चर को किसी प्रकार के कंटेनर (या मेमोरी लोकेशन) के रूप में समझा जाता है जो एक मूल्य के प्रतिनिधित्व को याद कर सकता है, और संभवतः इसके वर्तमान मूल्य को दूसरे के द्वारा बदल दिया जाता है)।

फंक्शनल प्रोग्रामिंग में, एक वैरिएबल का एक ही उद्देश्य होता है कि वह गणित में कुछ मूल्य के लिए एक स्थान-धारक के रूप में करता है, फिर भी प्रदान किया जाना है। पारंपरिक अनिवार्य प्रोग्रामिंग में यह भूमिका वास्तव में निरंतर द्वारा निभाई जाती है ( शाब्दिक रूप से भ्रमित न होने के लिए जो मानों के उस क्षेत्र के लिए एक संकेतन के साथ व्यक्त मूल्य निर्धारित किए जाते हैं, जैसे कि 123, सत्य, ["abdcz", 3.14])।

किसी भी प्रकार के चर, साथ ही साथ निरंतर, को पहचानकर्ताओं द्वारा दर्शाया जा सकता है।

अनिवार्यता परिवर्तनशील चर का मान बदल सकता है और यही परिवर्तनशीलता का आधार है। कार्यात्मक चर नहीं कर सकता।

प्रोग्रामिंग भाषाएं आमतौर पर बड़ी संस्थाओं के लिए भाषा में छोटे लोगों से निर्माण करने की अनुमति देती हैं।

इम्पीरेटिव भाषाएं ऐसे निर्माणों के लिए चर को शामिल करने की अनुमति देती हैं और यही आपको परस्पर डेटा देता है।

प्रोग्राम कैसे पढ़ें

एक कार्यक्रम मौलिक रूप से आपके एल्गोरिथ्म का एक अमूर्त विवरण है कुछ भाषा, चाहे एक व्यावहारिक डिजाइन हो, या एक सामान्य रूप से शुद्ध भाषा।

सिद्धांत रूप में, आप प्रत्येक कथन को ले सकते हैं कि इसका सार क्या है। तब कंपाइलर अनुवाद करेगा कि कंप्यूटर को निष्पादित करने के लिए कुछ उपयुक्त रूप में, लेकिन यह पहली बार में आपकी समस्या नहीं है।

बेशक, वास्तविकता थोड़ी कठोर है, और यह अक्सर अच्छा होता है कि कुछ ऐसा होता है जो संरचनाओं से बचने के लिए ऐसा होता है कि संकलक को यह पता नहीं चलेगा कि कुशल निष्पादन के लिए कैसे व्यवहार किया जाए। लेकिन यह पहले से ही अनुकूलन है ... जो संकलक प्रोग्रामर की तुलना में अक्सर बेहतर हो सकते हैं।

कार्यात्मक प्रोग्रामिंग और परिवर्तनशीलता

म्यूटेबिलिटी एसेबल वैरिएबल के अस्तित्व पर आधारित है जिसमें असाइनमेंट द्वारा बदले जा सकने वाले मान हो सकते हैं। चूंकि ये कार्यात्मक प्रोग्रामिंग में मौजूद नहीं हैं, इसलिए सब कुछ अपरिवर्तनीय के रूप में देखा जा सकता है।

Fuctional प्रोग्रामिंग विशेष रूप से मूल्यों के साथ संबंधित है।

अपरिवर्तनीयता पर आपके पहले चार कथन अधिकांशतः सही हैं, लेकिन अनिवार्य दृश्य के साथ कुछ ऐसा वर्णन करें जो अत्यावश्यक न हो। यह एक ऐसी दुनिया में रंगों के साथ वर्णन करने जैसा है जहां हर एक अंधा है। आप उन अवधारणाओं का उपयोग कर रहे हैं जो कार्यात्मक प्रोग्रामिंग के लिए विदेशी हैं।

आपके पास केवल शुद्ध मान हैं, और पूर्णांक का एक सरणी एक शुद्ध मूल्य है। एक और सरणी प्राप्त करने के लिए जो केवल एक तत्व में भिन्न है, आपको एक अलग सरणी मान का उपयोग करना होगा। एक तत्व को बदलना सिर्फ एक अवधारणा है जो इस संदर्भ में मौजूद नहीं है। आपके पास एक फ़ंक्शन हो सकता है जिसमें तर्क के रूप में एक सरणी और कुछ सूचकांक होते हैं, और एक परिणाम देता है जो लगभग समान सरणी है जो केवल सूचकांकों द्वारा इंगित किए गए भिन्न होते हैं। लेकिन यह अभी भी एक स्वतंत्र सरणी मूल्य है। इन मूल्य का प्रतिनिधित्व कैसे किया जाता है यह आपकी समस्या नहीं है। हो सकता है कि वे कंप्यूटर के लिए अनिवार्य अनुवाद में "साझा" करते हैं ... लेकिन यह कंपाइलर का काम है ... और आप यह भी नहीं जानना चाहते हैं कि यह किस तरह की मशीन वास्तुकला है।

आप मूल्यों की नकल नहीं करते हैं (यह कोई मतलब नहीं है, यह एक विदेशी अवधारणा है)। आप उन मानों का उपयोग करते हैं जो आपके प्रोग्राम में परिभाषित डोमेन में मौजूद हैं। या तो आप उनका वर्णन करते हैं (शाब्दिक के रूप में) या वे कुछ अन्य मूल्यों के लिए एक फ़ंक्शन लागू करने का परिणाम हैं। आप उन्हें यह सुनिश्चित करने के लिए एक नाम दे सकते हैं (इस प्रकार एक स्थिरांक को परिभाषित) कि कार्यक्रम में विभिन्न स्थानों में एक ही मूल्य का उपयोग किया जाता है। ध्यान दें कि फ़ंक्शन एप्लिकेशन को गणना के रूप में नहीं बल्कि दिए गए तर्कों के लिए आवेदन के परिणाम के रूप में माना जाना चाहिए। लिखने 5+2या लिखने की 7मात्रा। जो पिछले पैराग्राफ के अनुरूप है।

कोई आवश्यक चर नहीं हैं। कोई असाइनमेंट संभव नहीं है। आप नाम को केवल मूल्यों के लिए (स्थिरांक बनाने के लिए) बाध्य कर सकते हैं, अनिवार्य भाषाओं के विपरीत, जहाँ आप नामों को असाइन करने योग्य चर से बाँध सकते हैं।

चाहे जटिलता में एक लागत पूरी तरह से अस्पष्ट हो। एक चीज के लिए, आप जटिलता संबंधी चिंताओं के संदर्भ में हैं। इसे कार्यात्मक प्रोग्रामिंग के लिए परिभाषित नहीं किया जाता है, जब तक कि आप अपने कार्यात्मक कार्यक्रम को अनिवार्य के रूप में पढ़ना पसंद नहीं करते हैं, जो डिजाइनर का इरादा नहीं है। वास्तव में कार्यात्मक दृष्टिकोण आपको ऐसे मुद्दों के बारे में चिंता न करने और जो गणना की जा रही है उस पर ध्यान केंद्रित करने का इरादा है। यह विनिर्देश बनाम कार्यान्वयन जैसा है।

कंपाइलर को कार्यान्वयन का ध्यान रखना है, और सबसे अच्छा अनुकूल करने के लिए पर्याप्त स्मार्ट होना है कि हार्डवेयर को क्या करना है जो वह करेगा, जो भी हो।

मैं यह नहीं कह रहा हूं कि प्रोग्रामर कभी इस बारे में चिंता नहीं करते हैं। मैं यह भी नहीं कह रहा हूं कि प्रोग्रामिंग लैंग्वेज और कंपाइलर तकनीक उतनी ही परिपक्व हैं जितनी हम उन्हें बनने की इच्छा रख सकते हैं।

सवालों के जवाब दे रहे हैं

  1. आप मौजूदा मूल्य (एलियन कॉन्सेप्ट) को संशोधित नहीं करते हैं, लेकिन नए मूल्यों की गणना करते हैं, जहां वांछित है, संभवतः एक अतिरिक्त तत्व होने से यह एक सूची है।

  2. कार्यक्रम में नया डेटा मिल सकता है। पूरी बात यह है कि आप इसे भाषा में कैसे व्यक्त करते हैं। आप उदाहरण के लिए विचार कर सकते हैं कि कार्यक्रम एक विशिष्ट मूल्य के साथ काम करता है, संभवतः आकार में अनबाउंड, जिसे इनपुट स्ट्रीम कहा जाता है। यह एक ऐसा मूल्य है जो माना जाता है कि वह वहां बैठा है (चाहे वह पहले से ही पूरी तरह से जाना जाता है या आपकी समस्या नहीं है)। फिर आपके पास एक फ़ंक्शन होता है जो स्ट्रीम के पहले तत्व और शेष स्ट्रीम से बना एक जोड़ी देता है।

    आप उपयोग कर सकते हैं कि संचार उपकरणों के नेटवर्क को शुद्ध रूप से लागू करने के तरीके (कोराउटाइन) में

  3. मशीन लर्निंग एक और समस्या है जब आपको डेटा को एक्सेप्ट करना है और वैल्यूज को मॉडिफाई करना है। कार्यात्मक प्रोग्रामिंग में आप ऐसा नहीं करते हैं: आप बस नए मूल्यों की गणना करते हैं जो प्रशिक्षण डेटा के अनुसार उचित रूप से भिन्न होते हैं। परिणामस्वरूप मशीन भी काम करेगी। आपको जिस चीज की चिंता है, वह है समय और अंतरिक्ष दक्षता की गणना करना। लेकिन, फिर से, यह एक अलग मुद्दा है, कि आदर्श रूप से संकलक द्वारा निपटा जाना चाहिए।

अंतिम टिप्पणी

यह स्पष्ट है, टिप्पणियों या अन्य उत्तरों से, व्यावहारिक व्यावहारिक प्रोग्रामिंग भाषा विशुद्ध रूप से कार्यात्मक नहीं हैं। यह इस तथ्य पर एक प्रतिबिंब है कि हमारी तकनीक में अभी भी सुधार किया जाना है, खासकर जहां संकलन का संबंध है।

क्या विशुद्ध रूप से प्रयोजनीय शैली में लिखना संभव है? उत्तर को लगभग 40 वर्षों से जाना जाता है और यह "हाँ" है। 1970 के दशक में दिखाई देने वाले शब्दार्थिक शब्दार्थ का बहुत ही उद्देश्य विशुद्ध रूप से कार्यात्मक शैली में भाषाओं का अनुवाद (संकलन) करना था, जिन्हें गणितीय रूप से बेहतर समझा जाता था और इस प्रकार कार्यक्रमों के शब्दार्थ को परिभाषित करने के लिए एक बेहतर कोष माना जाता था।

दिलचस्प पहलू ओटी यह है कि वैरिएबल प्रोग्रामिंग संरचना, जिसमें चर भी शामिल हैं, को एक कार्यात्मक शैली में अनुवाद किया जा सकता है, जिसमें मानों के उपयुक्त डोमेन, जैसे डेटा स्टोर शुरू किया जा सकता है। और कार्यात्मक शैली के बावजूद, यह आश्चर्यजनक रूप से अनिवार्य शैली में लिखे गए वास्तविक संकलक के कोड के समान है।


0

यह एक गलत धारणा है कि कार्यात्मक कार्यक्रम डेटा को स्टोर नहीं कर सकते हैं, और मुझे नहीं लगता कि जेक के जवाब ने वास्तव में यह बहुत अच्छा समझाया।

कार्यात्मक कार्यक्रम, किसी भी कार्यक्रम की तरह हैं, वास्तव में पूर्णांक से पूर्णांक को मैप करने का कार्य करते हैं। परिवर्तनशील डेटा संरचनाओं पर काम करने वाले किसी भी अनिवार्य कार्यक्रम में एक कार्यात्मक समकक्ष है। यह उसी अंत को प्राप्त करने का एक और साधन है।

कुछ स्रोत से प्रयोग डेटा संग्रहीत करने का कार्यात्मक तरीका डेटा संरचना के साथ स्टोरिंग फ़ंक्शन को तर्क के रूप में बुलाएगा और मौजूदा डेटा संरचना और नए डेटा के एक संयोजन का उत्पादन करेगा और इस प्रकार डेटा को परस्पर डेटा संरचनाओं की धारणा के बिना संग्रहीत किया जाता है।

मेरे अपने अनुभव से , मुझे लगता है कि अपरिवर्तनीय डेटा संरचनाओं की अवधारणा पारंपरिक डेवलपर्स को यह सोचने के लिए प्रेरित कर रही है कि कुछ चीजें हैं जो कार्यात्मक सेटिंग में अव्यवहारिक या असंभव भी हैं। यह मामला नहीं है।


"कार्यात्मक कार्यक्रम, किसी भी कार्यक्रम की तरह हैं, वास्तव में पूर्णांकों को पूर्णांक में मैप करने का कार्य करते हैं।" कैसे कहते हैं, Minecraft, वास्तव में एक फ़ंक्शन मानचित्रण पूर्णांक से पूर्णांक है?
डेविड रिक्टरबी

सरलता। हर बाइट की व्याख्या बाइनरी पूर्णांक के रूप में की जा सकती है। कंप्यूटर में एक राज्य बाइट्स का एक संग्रह है। एक कार्यक्रम, यहां तक ​​कि Minecraft, एक कंप्यूटर राज्य में हेरफेर करता है, इसे एक राज्य से दूसरे में मैप करता है।
जेपी हार्टमुंड

उपयोगकर्ता इनपुट इस दुनिया में फिट नहीं लगता है।
डेविड रिचीर्बी

उपयोगकर्ता इनपुट एक कंप्यूटर स्थिति का हिस्सा है। यह आपकी स्क्रीन पर मौजूद नहीं है।
जेपी हार्टमुंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.