11

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

यह देखते हुए कि आप कार्यात्मक प्रोग्रामिंग करना चाहते हैं, उपयोग के मामले क्या हैं जहां अंतर्निहित आलस्य आपको चीज़ों को स्पष्ट रूप से या संक्षेप में स्पष्ट रूप से व्यक्त करने देती है?

बस बताया गया: आलसी इतनी महत्वपूर्ण क्यों है कि आप इसे भाषा में बनाना चाहते हैं?

(मैं उपयोग के मामलों में अधिक नहीं बल्कि एक डेमो से एक आवेदन पत्र की ओर उन्मुख के लिए देख रहा हूँ - मुझे पता है तुम प्राकृतिक संख्या की एक अनंत सूची छान कर रूढ़ अंक की असीमित सूची का निर्माण करने जैसे काम कर सकें, लेकिन जो लिखते हैं कि दस बार 'सामने दोपहर का भोजन ...)

+0

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

+0

मुझे नहीं पता कि आपको यहां अच्छे उत्तर मिलेंगे या नहीं, यह प्रश्न प्रोग्रामर के लिए प्रोग्रामिंग भाषा डिजाइनरों के लिए अधिक है। यह सवाल है कि एक [कंप्यूटर विज्ञान के बारे में साइट] (http://area51.stackexchange.com/proposals/35636/computer-cience-non-programming?referrer=4M74nqLafvszXN85c5ibxQ2) बेहतर काम करेगा। मैं लेखों की सिफारिश करता हूं [विकिपीडिया पर उद्धृत] (http://en.wikipedia.org/wiki/Lazy_evaluation#Further_reading) (WP लेख स्वयं नहीं), खासकर "क्यों एफपी मायने रखता है"। – Gilles

+0

रावलस: @ गिल्स के संपादन के आधार पर, मैंने एक अंतर्निहित फीचर के रूप में आलस्य के सवाल पर बल देने के लिए आगे संशोधित किया है (उदाहरणों के उदाहरण के बजाय अंत-लक्ष्य के रूप में उदाहरण के लिए उपयोग किए गए उदाहरणों के साथ), और इस धारणा पर फिर से खोला गया यह स्वीकार्य है। यदि आप असहमत हैं, तो कृपया चर्चा करें। – Shog9

उत्तर

19

"किसी अन्य स्थान पर इसकी आवश्यकता होने तक कुछ भी मूल्यांकन नहीं किया जाता है" एक सरलीकृत रूपक है जो आलसी मूल्यांकन के सभी पहलुओं को कवर नहीं करता है (उदाहरण के लिए यह कठोरता घटना का उल्लेख नहीं करता है)।

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

उनमें से प्रत्येक के पास इसके फायदे और नुकसान हैं, इसलिए आपको संबंधित शोध पत्रों को पढ़ने की आवश्यकता है।

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

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

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

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

"जो दस बार 'लंच लंच लिखता है" के लिए - जो भी अपनी परियोजनाओं के लिए हास्केल का उपयोग करता है। मुझे लगता है कि एक भाषा का उपयोग कर एक गैर-खिलौना परियोजना विकसित करना (आपके मामले में एक गैर-सख्त भाषा) अपने फायदे और नुकसान को समझने का सबसे अच्छा तरीका है।

नीचे आलस्य के लिए कुछ सामान्य usecases गैर खिलौना उदाहरण के रूप में रेखांकित कर रहे हैं:

  1. मामलों जब नियंत्रण प्रवाह का अनुमान लगाना कठिन है। विशेषता व्याकरण के बारे में सोचें जब आलस्य के बिना आपको निर्भरताओं को हल करने के लिए विशेषताओं पर एक स्थलीय प्रकार का प्रदर्शन करना होगा। जब भी निर्भरता ग्राफ बदल जाता है तो हर बार अपना कोड दोबारा क्रमबद्ध करना व्यावहारिक नहीं है। हास्केल में आप एक स्पष्ट सॉर्टिंग के बिना विशेषता व्याकरण औपचारिकता को कार्यान्वित कर सकते हैं, और हैकेज पर कम से कम दो वास्तविक कार्यान्वयन हैं। विशेषता व्याकरण संकलक निर्माण में व्यापक आवेदन है।

  2. कई अनुकूलन समस्याओं को हल करने के लिए "उत्पन्न और खोज" दृष्टिकोण। एक सख्त भाषा में आपको पीढ़ी और खोज को अंतःस्थापित करना है, हास्केल में आप केवल अलग पीढ़ी और खोज कार्यों को लिखते हैं, और आपका कोड वाक्य रचनात्मक रूप से मॉड्यूलर रहता है, लेकिन रनटाइम पर interleaved। यात्रा करने वाले विक्रेता समस्या (टीएसपी) के बारे में सोचें, जब आप सभी संभावित पर्यटन उत्पन्न करते हैं और फिर शाखा-और-बाध्य एल्गोरिदम का उपयोग करके उनके माध्यम से खोज करते हैं। ध्यान दें कि एक बाध्य एल्गोरिदम शाखा केवल दौरे के कुछ पहले शहरों की जांच करती है, केवल मार्गों के आवश्यक हिस्सों को उत्पन्न किया जाता है। टीएसपी के पास अपने शुद्धतम फॉर्मूलेशन, जैसे योजना, रसद, और माइक्रोचिप्स के निर्माण में कई अनुप्रयोग हैं। थोड़ा संशोधित, यह कई क्षेत्रों में उप-समस्या के रूप में प्रकट होता है, जैसे डीएनए अनुक्रमण।

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

  4. आलसी संभवतः असीमित डेटा संरचना खिलौनों के उदाहरणों से परे उपयोगी हैं। कोशिशों का उपयोग कर उच्च आदेश कार्यों को याद करने पर कोनल इलियट के कार्यों को देखें। अनंत डेटा संरचनाएं अनंत खोज रिक्त स्थान (2 देखें), अनंत लूप और पाइथन अर्थ में कभी-कभी थकाऊ जनरेटर के रूप में दिखाई देती हैं (देखें 3)।

+0

उल्लिखित रूपक का स्रोत हैन्डर्सन और मॉरिस द्वारा "आलसी मूल्यांकनकर्ता" प्रतीत होता है, पीओपीएल 76 – nponeccop

2

मैक ओएस एक्स के मुख्य छवि आलसी मूल्यांकन का एक अच्छा व्यावहारिक उदाहरण है।

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

2

ह्यूजेस के क्लासिक Why Functional Programming Matters में इस बिंदु की व्यापक चर्चा है। वहां, ह्यूजेस का तर्क है कि आलसीपन कई सुलभ उदाहरणों का उपयोग करके मॉड्यूलरिटी में सुधार की अनुमति देता है।

संबंधित मुद्दे