इंप्रूव लैंग्वेज वास्तव में अधिक परिचित अनिवार्य भाषाओं से सिद्धांत में भिन्न नहीं हैं, खासकर अब जब कि कई कार्यात्मक ट्रिक की नकल की गई है। अलग क्या शैली है - आप समस्याओं को कैसे हल करते हैं।
चाहे आप हास्केल को शुद्ध मानते हैं, या IO मोनाद को अशुद्धता के रूप में गिनते हैं, हास्केल शैली इस शैली का एक चरम रूप है और अच्छी तरह से सीखने लायक है।
हास्केल आईओ मोनाड पाठ्यक्रम के गणितीय सिद्धांत (निश्चित रूप से) से बना है। हालांकि, अनिवार्य प्रोग्रामर के लिए, मुझे लगता है कि भिक्षुओं पर पहुंचने का एक पिछड़ा तरीका अधिक समझ में आता है।
चरण एक - एक शुद्ध कार्यात्मक भाषा अपने परिणाम के रूप में आसानी से एक बड़ी स्ट्रिंग मान लौटा सकती है। यह बड़ी स्ट्रिंग कुछ आवश्यक-निर्दिष्ट मापदंडों से शुद्ध कार्यात्मक तरीके से प्राप्त एक अनिवार्य कार्यक्रम का स्रोत कोड हो सकता है। फिर आप एक "उच्च स्तर" कंपाइलर का निर्माण कर सकते हैं जो आपके कोड जनरेटर को चलाता है, फिर स्वचालित रूप से उस उत्पन्न कोड को अनिवार्य भाषा कंपाइलर में फीड करता है।
चरण दो - पाठ स्रोत कोड उत्पन्न करने के बजाय, आप एक दृढ़ता से टाइप किया हुआ सार वाक्यविन्यास ट्री बनाते हैं। आपका अनिवार्य भाषा संकलक आपके "उच्च स्तर" संकलक में अवशोषित हो जाता है, और एएसटी को सीधे स्रोत कोड के रूप में स्वीकार करता है। यह हास्केल जो करता है, उसके बहुत करीब है।
यह अभी भी अजीब है, हालांकि। उदाहरण के लिए आपके पास दो अलग-अलग प्रकार के कार्य हैं - जिनका मूल्यांकन कोड-जनरेटिंग चरण के दौरान किया गया था और जब उत्पन्न प्रोग्राम चलाया जाता है तो वे निष्पादित होते हैं। यह C ++ में फ़ंक्शन और टेम्प्लेट के बीच का अंतर है।
इसलिए, चरण 3 के लिए, दो को समान बनाएं - समान सिंटैक्स वाले समान फ़ंक्शन को "कोड पीढ़ी" के दौरान आंशिक रूप से मूल्यांकन किया जा सकता है, या पूरी तरह से मूल्यांकन किया जा सकता है, या बिल्कुल भी मूल्यांकन नहीं किया जा सकता है। इसके अलावा, पुनरावर्तन के पक्ष में एएसटी नोड्स के सभी लूपिंग निर्माण को छोड़ दें। वास्तव में, एक विशेष प्रकार के डेटा के रूप में एएसटी नोड्स के विचार को पूरी तरह से त्याग दें - आपके पास "शाब्दिक मूल्य" एएसटी नोड्स नहीं हैं, बस मूल्य आदि।
यह बहुत ज्यादा है जो आईओ सनक करता है - बाइंड ऑपरेटर प्रोग्राम बनाने के लिए "कार्रवाई" की रचना करने का एक तरीका है। यह कुछ खास नहीं है - सिर्फ एक फंक्शन। "कोड पीढ़ी" के दौरान कई अभिव्यक्तियों और कार्यों का मूल्यांकन किया जा सकता है, लेकिन जो लोग I / O साइड-इफेक्ट्स पर निर्भर करते हैं, उन्हें रन-टाइम तक मूल्यांकन में देरी होनी चाहिए - किसी विशेष नियम द्वारा नहीं, बल्कि डेटा निर्भरता के प्राकृतिक परिणाम के रूप में भाव।
सामान्य रूप से मोनाड सिर्फ सामान्यीकरण हैं - उनका एक ही इंटरफ़ेस है, लेकिन अमूर्त संचालन को अलग तरीके से लागू करते हैं, इसलिए अनिवार्य कोड के विवरण का मूल्यांकन करने के बजाय वे कुछ और का मूल्यांकन करते हैं। एक ही इंटरफ़ेस होने का मतलब है कि कुछ चीजें हैं जो आप बिना मोनाड के देखभाल के लिए कर सकते हैं, जो उपयोगी साबित होती है।
इस विवरण से कोई संदेह नहीं होगा कि शुद्धतावादी प्रमुख विस्फोट करेंगे, लेकिन मेरे लिए यह कुछ वास्तविक कारणों की व्याख्या करता है कि हास्केल दिलचस्प क्यों है। यह प्रोग्रामिंग और मेटाप्रोग्रामिंग के बीच की सीमा को धुंधला कर देता है, और विशेष प्रोग्रामिंग की आवश्यकता के बिना आवश्यक प्रोग्रामिंग को सुदृढ़ करने के लिए कार्यात्मक प्रोग्रामिंग के टूल का उपयोग करता है।
मेरे पास C ++ टेम्पलेट्स की एक आलोचना यह है कि वे एक अनिवार्य भाषा में एक प्रकार के टूटे हुए शुद्ध कार्यात्मक उप भाषा हैं - संकलन-समय पर एक ही मूल कार्य का मूल्यांकन करने के लिए, रन-टाइम के बजाय आपको इसे पूरी तरह से अलग शैली का उपयोग करके फिर से लागू करना होगा कोडिंग का। हास्केल में, जबकि अशुद्धता को अपने प्रकार में लेबल किया जाना चाहिए, सटीक एक ही फ़ंक्शन का मेटा-प्रोग्रामिंग अर्थों में और एक ही कार्यक्रम में एक रन-टाइम गैर-मेटा-प्रोग्रामिंग अर्थ में मूल्यांकन किया जा सकता है - कोई हार्ड लाइन नहीं है प्रोग्रामिंग और मेटाप्रोग्रामिंग के बीच।
उस ने कहा, कुछ मेटाप्रोग्रामिंग चीजें हैं जो मानक हास्केल नहीं कर सकते हैं, मूल रूप से क्योंकि प्रकार (और शायद कुछ अन्य चीजें) प्रथम श्रेणी के मान नहीं हैं। हालांकि, यह पता करने की कोशिश करने वाले भाषा संस्करण हैं।
हास्केल के बारे में बहुत सी बातें मैंने अशुद्ध कार्यात्मक भाषाओं में लागू की जा सकती हैं - और कभी-कभी अनिवार्य भाषा भी। हास्केल अलग है क्योंकि आपके पास इस दृष्टिकोण को लेने के अलावा कोई विकल्प नहीं है - यह मूल रूप से आपको काम करने की इस शैली को सीखने के लिए मजबूर करता है। आप "सी इन एमएल लिख सकते हैं", लेकिन आप "हास्केल में सी नहीं लिख सकते हैं" - कम से कम यह जानने के बिना कि हुड के नीचे क्या चल रहा है।