राज्य बदलने पर भरोसा करना क्यों अच्छा है?


16

यह प्रश्न उठता है /software/25569/is-haskell-worth-learning

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

क्यों?

मैंने किसी को इसकी तुलना केवल बाएं हाथ से टाइप करने, या शायद एक दिन के लिए अपनी आँखें बंद करने और सिर्फ स्पर्श पर भरोसा करने के लिए किया है। निश्चित रूप से इससे कहीं अधिक है?

क्या यह हार्डवेयर मेमोरी एक्सेस से संबंधित है, या कुछ और जो एक बड़ा प्रदर्शन लाभ है?


2
हास्केल अकादमिक है। मैं रिच हिक्की द्वारा क्लोजर के बारे में कुछ व्याख्यान देखूंगा - वहां वह हत्यारा व्यावहारिक तर्क देता है (जेवियर द्वारा 3 बिंदुओं के समान, लेकिन यह भी एक सरल तरीके से किया गया है)।
जॉब


6
सिर्फ इसलिए कि हास्केल "अकादमिक" है इसका मतलब यह नहीं है कि यह अव्यावहारिक है या व्यावहारिक नहीं है।
तिखन जेल्विस

जवाबों:


17

मेरे सिर के ऊपर से कम से कम तीन बड़े फायदे हैं:

  1. यह गणितीय अभिव्यक्तियों के अधिक कार्यक्रम बनाता है। गणित में, xआप परिवर्तन नहीं करते हैं, आप समीकरण को हल करने तक यह नहीं जानते कि यह क्या है।

  2. अंत में, वहाँ है राज्य परिवर्तन (सभी के बाद, यह है कि कैसे कंप्यूटर निम्न स्तर पर काम करता है); लेकिन यह भाषा द्वारा विशिष्ट स्थानों तक ही सीमित है। कंपाइलर विशाल अवसरों को इसे अनुकूलित करने के लिए कोड को स्थानांतरित करने की अनुमति देता है, क्योंकि यह जानता है कि यह कुछ भी नहीं बदलता है जो अन्य कोड पर निर्भर करता है।

  3. समवर्ती कोड को गैर-बदलते डेटा तक पहुंचने के लिए सिंक्रनाइज़ करने की आवश्यकता नहीं है, इसलिए समरूपता को बढ़ाया जाता है, दोनों एसएमपी साझा मेमोरी सिस्टम (आज के सभी मल्टीकोर सिस्टम), और शिथिल बंधे हुए समूहों पर।


3
फ़ंक्शनल प्रोग्रामिंग के प्रॉस्पेक्ट्स ने सबसे अधिक तनाव # 3, यानी आसान कंसीडर प्रॉमिमिंग को बढ़ा दिया।
Mchl

4
@Mchl: मेरे अनुभव में उन्होंने "तनाव को समझना और उसके बारे में तर्क करना आसान है" पर सबसे अधिक जोर दिया, जो 1. से मेल खाती है। हालांकि मुझे लगता है कि भाषा समुदायों के बीच अंतर हो सकता है।
15

+1, बहुत पूरा जवाब। @ sepp2k: दोनों महत्वपूर्ण हैं जो मुझे लगता है। एक कार्यक्रम के बारे में तर्क हम रोजाना करते हैं, और यह सच है कि अगर आपको यह जांचने की जरूरत नहीं है कि राज्य कुछ गहरे छिपे हुए फ़ंक्शन में नहीं बदला है, तो केवल उच्च-स्तरीय विधियों को पढ़ना और जो चल रहा है उसे पकड़ना बहुत आसान है। हार्डवेयर-वार: चूंकि हम मल्टी-कोर और मल्टी-प्रोसेसर की ओर अधिक बढ़ रहे हैं (हालांकि मुझे लगता है कि होम कंप्यूटर को मल्टी-प्रोसेसर मिलने से पहले थोड़ी देर होगी), एक ऐसी भाषा का होना जिसमें समवर्ती प्रोग्रामिंग की सुविधा एक प्रीमियम हो।
मैथ्यू एम। Mat

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

1
@Yrrill, कार्यात्मक भाषाएं कचरा संग्रह पर उनकी निर्भरता में अद्वितीय नहीं हैं और जब आप अपरिवर्तनीय डेटा के साथ काम कर रहे हैं तो कचरा संग्रह बहुत आसान है। एक निर्देश आधारित वास्तुकला पर किसी भी गणना करने का मतलब है कि राज्य को संशोधित करना, इसका मतलब यह नहीं है कि कार्यात्मक भाषाएँ किसी भी तरह से अधिक कठिन हैं। समानतावाद पर कार्यात्मक भाषाएं रॉक करती हैं; डेटा के समानांतर हास्केल को देखना, यह एक ऐसी सुविधा है जिसे अनिवार्य भाषा में जोड़ना लगभग असंभव होगा।
dan_waterworth

4

यहां एक और फायदा है: कपलिंग में कमी। यदि आपके पास कोड है:

 function doStuff(x) { return x + y;}

और कहीं आपके पास:

 function doOtherStuff(x) { y++; return y + x;}

तब दो कार्य अंतर्निहित रूप से निर्भर होते हैं । यह बताने का कोई आसान तरीका नहीं है कि कॉल करने doStuffसे कॉलिंग प्रभावित होती है doOtherStuff। परिवर्तनशील स्थिति के बिना, आपको कनेक्शन स्पष्ट करना होगा।

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


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

2

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

उपरोक्त विश्लेषण में लब्बोलुआब यह है कि यह बिना किसी इरादे के टिप्पणी के बिना अप्राप्य है, अभिप्रायकर्ता, और शब्दार्थ: ये व्याख्या करना कठिन हो सकता है, और यह सत्यापित करना कठिन हो सकता है कि शब्दार्थ को वास्तविक कोड में पालन किया जाता है।

यह उत्तर मूल रूप से @ जेवियर पॉइंट 1 का विस्तार है।

मुझे लगता है कि यह धोखेबाज OO शासन की लोकप्रियता का स्पष्टीकरण भी है: OO के साथ उत्परिवर्तनीय राज्य का अतिक्रमण होता है जो कुछ हद तक उत्परिवर्तन को स्थानीय करके विश्लेषण को बहुत आसान बनाता है, और अर्थ विज्ञान के सत्यापन और सत्यापन की अधिक मजबूत अभिव्यक्ति की अनुमति देता है।

उल्लेखनीय है कि, कार्यात्मक प्रोग्रामिंग उत्तर नहीं है। सही उत्तर एक प्रणाली है जो आगमनात्मक (कार्यात्मक) और सहवर्ती (प्रक्रियात्मक) प्रोग्रामिंग का समर्थन करती है, इसलिए सही उपकरण स्टेटलेस और स्टेटफुल प्रोग्रामिंग दोनों को संभाल सकते हैं। यह सिर्फ इतना है कि रचनात्मक (कार्यात्मक) सिद्धांत अच्छी तरह से स्थापित है जबकि राज्य प्रबंधन का सिद्धांत अभी भी अपनी प्रारंभिक अवस्था में है।


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

Do-notation में वास्तव में se के प्रति स्टेटफुल कम्प्यूटेशन करने के लिए कुछ भी नहीं है । Do-notation सिर्फ monadic function पाइपलाइनों के शीर्ष पर एक सरल सिंटैक्स है। स्टेटफुल कम्प्यूटेशन केवल उन चीजों में से एक है, जिन्हें मोनाड्स का उपयोग करके व्यक्त किया जा सकता है, और इसलिए डॉक्यू-नोटेशन।
जोनाथन स्टर्लिंग

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

2

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

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

तथ्यों को व्यक्त करने के लिए उपयोग की जाने वाली अपरिवर्तनीय स्थिति के साथ इसका विरोध करें। 12 अगस्त को कितने पद थे?

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

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