इसलिए, कहते हैं, डेटाबेस या लेखन फ़ाइल को क्वेरी शुद्ध परिभाषा में शुद्ध कार्यात्मक शैली में नहीं किया जा सकता है। उदाहरण के लिए, एक कारण है कि हमें भिक्षुओं की आवश्यकता है।
किसी को भी "जरूरत" मोनड्स नहीं है, यह चीजों का वर्णन करने का सिर्फ एक तरीका है। वास्तव में, यह शायद सबसे अच्छा तरीका भी नहीं है। कुछ प्रकार के प्रभाव टाइपिंग , विशिष्ट प्रकार , या पूर्ण रेखीय तर्क पर आधारित एक प्रणाली सिद्धांत में अधिक प्रेरक लगती है, लेकिन सभी प्रकार के प्रसिद्ध सिस्टम से अधिक कट्टरपंथी प्रस्थान हैं और व्यक्त करने के लिए अधिक जटिल हैं। हास्केल में पाया जाने वाला मोनाडिक IO प्रयोज्य और सरलता के बीच एक समझौता है, क्योंकि यह अनिवार्य रूप से पूरी तरह से अनिवार्य प्रोग्रामिंग को मॉडल करता है जो कि मौजूदा एमएल-स्टाइल प्रकार प्रणाली के साथ आसानी से सहवास किया जाता है।
सवाल यह है कि हम उत्पादन को कुछ अशुद्ध क्यों मानते हैं? हां, कोई भी फ़ाइलहैंडलर जोखिम भरा है - हम कभी भी सुनिश्चित नहीं हो सकते हैं कि डेटा हमेशा लिखा जाएगा। लेकिन STDOUT का क्या? क्यों हम इसे कुछ अविश्वसनीय के रूप में सोचना चाहिए? क्या यह अधिक अविश्वसनीय है कि स्वयं मूल्यांकन? मेरा मतलब है, हम हमेशा ट्रिगर खींच सकते हैं और इस प्रकार, बाधा गणना।
यह नहीं है, और हम नहीं। से इनपुट, और आउटपुट, एक पूरे के रूप में कार्यक्रम को केवल एक बड़े शुद्ध कार्य के रूप में पूरे कार्यक्रम को मानने से तर्क और परिणाम के रूप में माना जा सकता है। जब तक यह उसी चीज़ को प्रिंट करने के लिए प्रिंट करता है यदि आप इसे स्टड से एक ही चीज़ खिलाते हैं, तो यह अभी भी एक शुद्ध कार्य है। वास्तव में, मोनोएडिक IO शुरू करने से पहले, हास्केल ने एक स्ट्रीम-आधारित I / O प्रणाली का उपयोग किया था जो इनपुट और आउटपुट के लिए शुद्ध आलसी धाराओं का उपयोग करता था। यह इसे गिरा दिया क्योंकि यह स्पष्ट रूप से उपयोग करने के लिए एक दर्द था, जो आपको कुछ विचार दे सकता है कि आपने ऐसा कुछ क्यों नहीं सुना है। :]
इस बिंदु को एक बेहतर तरीके से बनाने के लिए, न्यूनतम गूढ़ भाषा पर विचार करें, लेज़ी के :
Lazy K एक कचरा-एकत्र, संदर्भित पारदर्शी पारदर्शी प्रोग्रामिंग भाषा है, जिसमें एक सरल स्ट्रीम-आधारित I / O सिस्टम है।
इस तरह की अन्य भाषाओं से जो आलसी के को अलग करता है वह इसकी अन्य विशेषताओं की लगभग कमी है। उदाहरण के लिए, यह एकीकृत हिंडले-मिलनर बहुरूपी प्रकार प्रणाली की पेशकश नहीं करता है। इसे प्लेटफ़ॉर्म-स्वतंत्र जीयूआई प्रोग्रामिंग और अन्य भाषाओं के लिए समर्थन के साथ एक व्यापक मानक पुस्तकालय के साथ नहीं भेजा गया है। न ही ऐसी किसी भी लाइब्रेरी को लिखा जा सकता है, अन्य चीजों के अलावा, Lazy K बिल्ट-इन के अलावा किसी भी फ़ंक्शन को परिभाषित या संदर्भित करने का कोई तरीका प्रदान नहीं करता है। यह अक्षमता संख्याओं, तारों, या किसी अन्य डेटा प्रकार के लिए समर्थन के मिलान की कमी से पूरित होती है। फिर भी, Lazy K ट्यूरिंग-पूर्ण है।
(...)
आलसी के कार्यक्रम गणितीय कार्यों के रूप में एक ही कालातीत पठारीय क्षेत्र में रहते हैं, जो अनलैम्ब्डा पेज "शुद्ध अनडिम्ड लैम्ब्डा कैलकुलस के धन्य दायरे" को कहते हैं। जिस तरह कचरा संग्रहण प्रोग्रामर से मेमोरी मैनेजमेंट की प्रक्रिया को छुपाता है, उसी तरह रेफरेंशियल ट्रांसपेरेंसी मूल्यांकन की प्रक्रिया को छिपाती है। तथ्य यह है कि कुछ गणना आवश्यक है कि मैंडलब्रॉट सेट की एक तस्वीर देखने के लिए, या एक आलसी के कार्यक्रम को "चलाने" के लिए, एक कार्यान्वयन विवरण है। यही कार्यात्मक प्रोग्रामिंग का सार है।
(...)
साइड इफेक्ट्स के बिना भाषा में इनपुट और आउटपुट कैसे संभालें? एक निश्चित अर्थ में, इनपुट और आउटपुट दुष्प्रभाव नहीं हैं; वे हैं, तो बोलने के लिए, सामने और पीछे प्रभाव। तो यह लज़ीज़ के में है, जहाँ एक प्रोग्राम को संभव इनपुट के स्पेस से एक फ़ंक्शन के रूप में संभव आउटपुट के स्थान पर माना जाता है।
मुझे संदेह है कि आपको इससे अधिक विशुद्ध रूप से कार्यात्मक भाषा मिलेगी!
हालांकि, ध्यान रखें कि उपरोक्त केवल शुद्ध रूप से इनपुट और आउटपुट लेने और उन्हें किसी तरह से "बाहरी रूप से" स्टडआउट / कनेक्ट करने के लिए अनिवार्य रूप से लागू होता है। उसके बीच एक बड़ा अंतर है और वास्तविक सिस्टम-स्तर I / O आदिमताओं तक पहुँच होना। धाराओं को पढ़ने और लिखने का कार्यान्वयन विवरण अशुद्धता को लीक कर सकता है जब तक कि सावधानीपूर्वक इनकैप्सुलेट नहीं किया गया हो।
मुझे उम्मीद है कि यह मुख्य कारण है कि आप सीधे हास्केल में ऐसा नहीं कर सकते - समझदार उपयोग के मामले मोनोडिक IO का उपयोग करने की तुलना में पतले होते हैं, और बाद के लिए वास्तविक चीज़ तक पहुंच होने का बहुत लाभ होता है। मेरा मानना है कि उदाहरण के लिए, प्रोग्राम के लिए कमांड-लाइन तर्क केवल तर्क के रूप में पारित नहीं किए जाते हैं main
, भले ही यह सहज रूप से लगता है कि उन्हें होना चाहिए।
आप एक विशिष्ट कार्यक्रम में इस तरह के एक न्यूनतम संस्करण को पुनर्प्राप्त कर सकते हैं, हालांकि - बस शुद्ध मूल्यों के रूप में तर्कों को कैप्चर करें और फिर अपने बाकी प्रोग्राम के लिए फ़ंक्शन का उपयोग करेंinteract
।