2013-02-11 16 views
6

के बीच समय संकलित करें और रन टाइम अंतर type घोषणा और newtype घोषणा के बीच, पठन-संकलन-संचालित पाइपलाइन के विभिन्न चरणों में क्या अंतर है?टाइप और न्यूटाइप

मेरे धारणा यह है कि वे एक ही मशीन निर्देश के लिए नीचे संकलित था, और उदाहरण

type Name = String 
newtype Name_ = N String 

के लिए आप एक Name कहीं भी एक String की आवश्यकता है उपयोग कर सकते हैं जहां कि फर्क सिर्फ इतना था जब कार्यक्रम, typechecked है लेकिन यदि आप Name_ का उपयोग करते हैं तो टाइपशेकर आपको कॉल करेगा, जहां String की अपेक्षा की जाती है, भले ही वे एक ही जानकारी को एन्कोड करते हों।

मैं सवाल पूछ रहा हूँ, क्योंकि अगर यह मामला है, मैं किसी भी कारण है कि निम्नलिखित घोषणाओं मान्य नहीं होना चाहिए नहीं दिख रहा है:

type List a = Either() (a, List a) 
newtype List_ a = L (Either() (a, List_ a)) 

हालांकि, प्रकार चेकर दूसरे को स्वीकार करता है एक लेकिन पहले को अस्वीकार करता है। ऐसा क्यों है?

+10

यह एक संकलन समस्या नहीं है, यह एक प्रकार की जांच समस्या है। हास्केल "इक्वि-रिकर्सिव प्रकार" के बजाय "आईएसओ-रिकर्सिव प्रकार" का उपयोग करता है, इसलिए यदि आप चाहते हैं कि आपका प्रकार रिकर्सिव हो, तो आपको वहां 'डेटा' या 'न्यूटाइप' होना चाहिए। प्रत्येक विकल्प के लिए विभिन्न व्यापार-बंद हैं। इन सिस्टमों और विकल्पों में शामिल विकल्पों के बारे में अधिक जानकारी के लिए पिएर्स द्वारा प्रकार और प्रोग्रामिंग भाषाएं देखें। – luqui

+2

धन्यवाद, मुझे लगता है कि मुझे Google के लिए क्या पता है यह जानने के लिए "आईएसओ-रिकर्सिव" और "इक्वि-रिकर्सिव" नामों की आवश्यकता है! अगर आप इसे उत्तर में बदलना चाहते हैं तो मैं इसे स्वीकार करूंगा। –

उत्तर

4

लुक्की की टिप्पणी एक उत्तर होना चाहिए। हास्केल में समानार्थी टाइप करें मैक्रोज़ से पहले कुछ अनुमान नहीं है। यही है, वे टाइप चेकर द्वारा पूरी तरह मूल्यांकन किए गए प्रकारों में विस्तारित होते हैं। टाइप चेकर अनंत प्रकारों को संभाल नहीं सकता है, इसलिए हास्केल में इक्वि-रिकर्सिव प्रकार नहीं हैं।

newtypes आपको आईएसओ-रिकर्सिव प्रकार प्रदान करता है, जीएचसी में, मूल रूप से मूल भाषा में इक्विटी-रिकर्सिव प्रकारों को संकलित करता है। हास्केल जीएचसी कोर नहीं है, इसलिए आपके पास ऐसे प्रकार तक पहुंच नहीं है। इक्की-रिकर्सिव प्रकार टाइप चेकर्स और इंसानों के लिए काम करने के लिए थोड़ा कठिन हैं, जबकि आईएसओ-रिकर्सिव प्रकारों के बराबर शक्ति है।

+0

धन्यवाद फिलिप। क्या मैं यह समझने में सही हूं कि जीएचसी कोर में इक्वि-रिकर्सिव प्रकार हैं? 'Newtype' टैग में जानकारी किस स्तर पर गायब हो जाती है? –

+0

मैं प्लेग की तरह कोर से बचता हूं, इसलिए नमक के अनाज के साथ जो भी मैं कहता हूं उसे ले लो: जीएचसी कोर में आईएसओ-रिकर्सिव प्रकार हैं। और नए प्रकार कोर में मौजूद नहीं हैं। मेरा विश्वास यह है कि इसे भविष्य में समानता बाधाओं के उपयोग के साथ प्रतिस्थापित किया जा सकता है: इसलिए 'सूची_ ए = (या तो() (ए, आर)) ~ आर => आर' प्रत्येक उपयोग मामले में डाले गए इन बराबरता के सबूत के साथ (ऐसा करने के लिए मशीनरी पहले से मौजूद है)। –

+0

@ फिलिपजेएफ: [यह थोड़ा और जटिल है।] (Http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/FC#Newtypesarecoercedtypes) अभी, नए प्रकार डेटा प्रकार और एक प्रकार में संकलित हो जाते हैं समानता सिद्धांत: 'newtype टी = एमकेटी Int' वसंत' axT: टी ~ Int' पैदा करता है। दुर्भाग्यवश, यह अस्वस्थ है: अगर हमारे पास 'परिवार का प्रकार एफ है; उदाहरण उदाहरण एफ इंट = बूल; उदाहरण उदाहरण एफ टी = चार', फिर 'बूल ~ एफ इंट', 'एफ इंट ~ एफ टी', और 'एफ टी ~ चर' टाइप करें। इस प्रकार 'बूल ~ चार', और हम मुसीबत में हैं। [इसे वास्तव में 'सामान्यीकृत न्यूटाइपडिविंग' के साथ जोड़ा जा सकता है।] (Http://hackage.haskell.org/trac/ghc/ticket/1496) –