STDOUT और इसकी अशुद्धता


10

मैंने कार्यात्मक प्रोग्रामिंग के बारे में बहुत सारी किताबें और लेख पढ़े हैं और अभी भी कुछ बहुत बुनियादी अवधारणाओं को समझने में सक्षम नहीं होने पर शर्म आती है।

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

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

जवाबों:


6

इसलिए, कहते हैं, डेटाबेस या लेखन फ़ाइल को क्वेरी शुद्ध परिभाषा में शुद्ध कार्यात्मक शैली में नहीं किया जा सकता है। उदाहरण के लिए, एक कारण है कि हमें भिक्षुओं की आवश्यकता है।

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

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

यह नहीं है, और हम नहीं। से इनपुट, और आउटपुट, एक पूरे के रूप में कार्यक्रम को केवल एक बड़े शुद्ध कार्य के रूप में पूरे कार्यक्रम को मानने से तर्क और परिणाम के रूप में माना जा सकता है। जब तक यह उसी चीज़ को प्रिंट करने के लिए प्रिंट करता है यदि आप इसे स्टड से एक ही चीज़ खिलाते हैं, तो यह अभी भी एक शुद्ध कार्य है। वास्तव में, मोनोएडिक IO शुरू करने से पहले, हास्केल ने एक स्ट्रीम-आधारित I / O प्रणाली का उपयोग किया था जो इनपुट और आउटपुट के लिए शुद्ध आलसी धाराओं का उपयोग करता था। यह इसे गिरा दिया क्योंकि यह स्पष्ट रूप से उपयोग करने के लिए एक दर्द था, जो आपको कुछ विचार दे सकता है कि आपने ऐसा कुछ क्यों नहीं सुना है। :]

इस बिंदु को एक बेहतर तरीके से बनाने के लिए, न्यूनतम गूढ़ भाषा पर विचार करें, लेज़ी के :

Lazy K एक कचरा-एकत्र, संदर्भित पारदर्शी पारदर्शी प्रोग्रामिंग भाषा है, जिसमें एक सरल स्ट्रीम-आधारित I / O सिस्टम है।

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

(...)

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

(...)

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

मुझे संदेह है कि आपको इससे अधिक विशुद्ध रूप से कार्यात्मक भाषा मिलेगी!


हालांकि, ध्यान रखें कि उपरोक्त केवल शुद्ध रूप से इनपुट और आउटपुट लेने और उन्हें किसी तरह से "बाहरी रूप से" स्टडआउट / कनेक्ट करने के लिए अनिवार्य रूप से लागू होता है। उसके बीच एक बड़ा अंतर है और वास्तविक सिस्टम-स्तर I / O आदिमताओं तक पहुँच होना। धाराओं को पढ़ने और लिखने का कार्यान्वयन विवरण अशुद्धता को लीक कर सकता है जब तक कि सावधानीपूर्वक इनकैप्सुलेट नहीं किया गया हो।

मुझे उम्मीद है कि यह मुख्य कारण है कि आप सीधे हास्केल में ऐसा नहीं कर सकते - समझदार उपयोग के मामले मोनोडिक IO का उपयोग करने की तुलना में पतले होते हैं, और बाद के लिए वास्तविक चीज़ तक पहुंच होने का बहुत लाभ होता है। मेरा मानना ​​है कि उदाहरण के लिए, प्रोग्राम के लिए कमांड-लाइन तर्क केवल तर्क के रूप में पारित नहीं किए जाते हैं main, भले ही यह सहज रूप से लगता है कि उन्हें होना चाहिए।

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


सर, मुझे कबूल करना चाहिए, मैं किसी भी ढेर पर आपके जवाब का आनंद लेता हूं। आपको निश्चित रूप से एक पुस्तक हास्केल लिखना चाहिए और मैं मजाक नहीं कर रहा हूं।
शबूनक

@ शबनम: मैंने कभी-कभी सोचा है कि एसओ पर मेरे जवाबों का कुल योग पहले से ही एक पुस्तक के आकार के बराबर है ...
सीए मैक्कन

क्या आप पूर्ण रेखीय तर्क के आधार पर एक प्रणाली का उदाहरण दे सकते हैं? यह दिलचस्प लगता है, अगर यह मौजूद है।
विन्यासकर्ता

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

3

जबकि एक कार्यात्मक कार्यक्रम में शुद्धता एक योग्य लक्ष्य है, वास्तविकता यह है कि आपके द्वारा उल्लिखित कारणों से प्रत्येक गैर-तुच्छ, उपयोगी कार्यक्रम में कुछ अशुद्धता (या "दुष्प्रभाव") होंगे।

पूरी तरह से शुद्ध कार्यक्रम, परिभाषा के अनुसार, एक सील ब्लैक बॉक्स हैं, और अनिवार्य रूप से निर्बाध हैं।

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


यकीन है, आप सही हैं। लेकिन मैं समझता हूं कि 100% शुद्धता यूटोपिया क्यों है। मेरा सवाल सिर्फ STDOUT के बारे में है।
15:03 बजे शबूनक

1
STDOUT एक साइड इफेक्ट है, किसी भी अन्य की तरह। आंतरिक रूप से, सनक किसी भी त्रुटि की जाँच करेगा जो आवश्यक हो सकता है।
रॉबर्ट हार्वे

हां, यह है कि यह सवाल क्या है - इसे किसी अन्य की तरह ही साइड इफेक्ट क्यों माना जाता है?
शबनम

2
बाहरी दुनिया को संशोधित करने वाली कोई भी चीज एक साइड इफेक्ट मानी जाती है।
रॉबर्ट हार्वे

1

STDOUT पर लिखना विफल हो सकता है यदि आप टर्मिनल डिवाइस से कनेक्ट नहीं हैं, या यदि आप (किसी कारण से) फ़ाइल-डिस्क्रिप्टर को इसके लिए बंद कर दिया है।

इसके अलावा, STDOUT हमेशा "कंसोल स्क्रीन" नहीं है। कभी-कभी यह एक और कार्यक्रम के लिए तैयार है। कभी-कभी पाइप टूट जाता है।


0

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

यह समवर्ती निष्पादन के मामले में भी एक मुद्दा हो सकता है। यदि आप जानते हैं कि किसी फ़ंक्शन का कोई दुष्प्रभाव नहीं है, तो आप आसानी से संगामिति की व्यवस्था कर सकते हैं क्योंकि आप यह साबित कर सकते हैं कि कोई दौड़ की स्थिति या पसंद नहीं हो सकती है।


बाहरी दुनिया की स्थिति को बदलता है या बाहरी दुनिया की स्थिति पर निर्भर करता है। इन पंक्तियों के साथ अधिक चर्चा के लिए यह प्रश्न देखें ।
मेट्रिक्सफ्रॉग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.