2016-03-02 2 views
7

हास्केल सीखने की कोशिश करते समय, उत्पन्न होने वाली कठिनाइयों में से एक क्षमता है जब कुछ को कंपाइलर से विशेष जादू की आवश्यकता होती है। दिमाग में आने वाला एक उदाहरण seq फ़ंक्शन है जिसे परिभाषित नहीं किया जा सकता है यानी आप seq2 फ़ंक्शन को बिल्कुल निर्मित seq के रूप में व्यवहार नहीं कर सकते हैं। नतीजतन, किसी को seq के बारे में पढ़ाने के दौरान, आपको यह उल्लेख करना होगा कि seq विशेष है क्योंकि यह कंपाइलर के लिए एक विशेष प्रतीक है।हास्केल कंपाइलर जादू: कंपाइलर से विशेष उपचार की आवश्यकता क्या है?

एक और उदाहरण do-नोटेशन होगा जो केवल Monad वर्ग के उदाहरणों के साथ काम करता है।

कभी-कभी, यह हमेशा स्पष्ट नहीं होता है। उदाहरण के लिए, निरंतरताएं। क्या संकलक Control.Monad.Cont के बारे में जानता है या क्या यह सादा पुराना हैस्केल है कि आप स्वयं का आविष्कार कर सकते थे? इस मामले में, मुझे लगता है कि संकलक से कुछ विशेष की आवश्यकता नहीं है, भले ही निरंतरता एक बहुत ही अजीब प्रकार का जानवर हो।

भाषा एक्सटेंशन अलग-अलग सेट किए गए हैं, अन्य कंपाइलर जादू हास्केल शिक्षार्थियों को किस बारे में पता होना चाहिए?

+1

स्पष्ट बताते हुए: "जादू" की किसी भी उचित परिभाषा के लिए कुछ भी 'आईओ' "जादू" के अंतर्गत आता है: https://www.reddit.com/r/haskell/comments/450baq/is_it_just_me_or_does_ios_definition_give_you_the/। इसके अलावा 'एसटी 'मोनैड, जो शायद और भी जादू है। – PyRulez

+1

एसटीएम के बारे में क्या? और धारा संलयन? – gawi

+0

हाँ, वे भी, लेकिन एसटीएम को आईओ से अपना जादू मिल जाता है, और भाप संलयन नियमों को फिर से लिखता है, जो स्वयं ही जादू है। – PyRulez

उत्तर

5

लगभग सभी ghc primitives जिन्हें उपयोगकर्तालैंड में लागू नहीं किया जा सकता है ghc-prim पैकेज में हैं। (यहां तक ​​कि GHC.Magic नामक एक मॉड्यूल भी है!)

तो ब्राउज़ करना यह एक अच्छी समझ देगा।

ध्यान दें कि आपको उपयोगकर्ता मॉड्यूल कोड में इस मॉड्यूल का उपयोग नहीं करना चाहिए जबतक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं। इससे उपयोग की जाने वाली अधिकांश सामग्री base में डाउनस्ट्रीम मॉड्यूल में निर्यात की जाती है, कभी-कभी संशोधित रूप में। उन डाउनस्ट्रीम स्थानों और एपीआई को अधिक स्थिर माना जाता है, जबकि ghc-prim इस बात की कोई गारंटी नहीं देता है कि यह संस्करण से संस्करण में कैसे कार्य करेगा।

GHC विशेष सामान GHC.Exts में reexported है, लेकिन अन्य बातों के बहुत सारे या संगामिति पुस्तकालयों, आदि

1

बहुरूपी seq निश्चित रूप से है (जैसे बुनियादी डेटा प्रकार, साथ ही seq के रूप में के रूप में) प्रस्तावना में जाने जादू। आप कर सकते हैं किसी भी विशिष्ट प्रकार के लिए seq लागू है, लेकिन केवल संकलक सभी संभव प्रकार के लिए एक समारोह को लागू कर सकते [और भले ही यह कोई-op लग रहा है इसे दूर के अनुकूलन से बचने]।

जाहिर है पूरे IO इकाई, गहरा जादू है संगामिति और समानांतरवाद (par, forkIO, MVar), परिवर्तनशील भंडारण, अपवाद फेंकने और पकड़ने के साथ करने के लिए सब कुछ है के रूप में, कचरा कलेक्टर लगाने और उन्हें समय से चलाने के आँकड़े, आदि

IO मोनड को ST मोनैड का एक विशेष मामला माना जा सकता है, जो जादू भी है। (यह वास्तव में परिवर्तनीय भंडारण की अनुमति देता है, जिसके लिए निम्न-स्तर की सामग्री की आवश्यकता होती है।)

दूसरी ओर, State मोनैड, पूरी तरह से सामान्य उपयोगकर्ता-स्तरीय कोड है जो कोई भी लिख सकता है। तो Cont मोनड है। तो विभिन्न अपवाद/त्रुटि monads हैं।

वाक्यविन्यास (डू-ब्लॉक, सूची समझ) के साथ कुछ भी करने के लिए भाषा परिभाषा में हार्ड-वायर्ड है।(हालांकि, इनमें से कुछ LANGUAGE RebindableSyntax का जवाब देते हैं, जो आपको यह बदलने देता है कि यह किस प्रकार के कार्यों से जुड़ा हुआ है।) deriving सामान; कंपाइलर "कुछ खास स्पेशल क्लास" के बारे में जानता है और उनके लिए उदाहरण कैसे उत्पन्न करें। newtype के लिए व्युत्पन्न किसी भी कक्षा के लिए काम करता है। (यह सिर्फ एक प्रकार से एक प्रकार की दूसरी प्रतिलिपि उस प्रतिलिपि की प्रतिलिपि बना रहा है।)

Arrays हार्ड-वायर्ड हैं। हर दूसरे प्रोग्रामिंग भाषा की तरह।

सभी विदेशी फ़ंक्शन इंटरफ़ेस स्पष्ट रूप से हार्ड-वायर्ड हैं।

एसटीएम उपयोगकर्ता कोड में लागू किया जा सकता है (मैंने इसे किया है), लेकिन वर्तमान में यह हार्ड-वायर्ड है। (मुझे लगता है कि यह एक महत्वपूर्ण प्रदर्शन लाभ देता है। मैंने वास्तव में इसे मापने की कोशिश नहीं की है।) लेकिन, अवधारणात्मक रूप से, यह सिर्फ एक अनुकूलन है; आप मौजूदा निम्न-स्तरीय concurrency primitives का उपयोग कर इसे कार्यान्वित कर सकते हैं।

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