2014-04-15 6 views
5

मान लीजिए मैं कुछ एडीटी है, जैसेबिना किसी बाधा के जीएडीटी (या अस्तित्व) को बिना किसी सामान्य एडीटी के रूप में तंग किया जा सकता है?

data Foo = Foo !Int 
     | Bar (Int->Int) Foo 

अब कहते हैं कि मैं अतिरिक्त प्रकार सुरक्षा के कुछ प्रकार लागू करने के लिए चाहते हैं, "जादुई संख्या प्रकार" से छुटकारा पाने:

{-# LANGUAGE GADTs #-} 

newtype Intey a = Intey { getIntey :: Int } 

data Foo' a where 
    Foo :: !(Intey a) -> Foo' a 
    Bar :: (Intey a -> Intey b) -> Foo' a -> Foo' b 

b के बाद से बस है कन्स्ट्रक्टर के भीतर एक प्रेत तर्क, कोई बाधा नहीं है या कुछ भी नहीं है, यह मूल रूप से अर्थहीन है - प्रकार चेकर को छोड़कर। इसलिए यह किसी भी प्रदर्शन आदि लागत के बिना Foo के समान संकलित कर सकता है?

+0

क्या जीएडीटी सिर्फ एडीटी + समानता बाधाओं, ('~') के संकलन नहीं करना चाहिए? – jozefg

+0

और अस्तित्व! –

उत्तर

7

आप कोर को देखने के लिए पूरी तरह से सुनिश्चित है, लेकिन सामान्य रूप में होने की आवश्यकता होगी:

  • newtype अंतर्निहित प्रकार की तुलना में कोई क्रम लागत है। हालांकि map getIntey जैसे कुछ भी सूची को कुछ भी नहीं कर पाएंगे।

  • प्रकार और प्रकार पैरामीटर स्वयं संकलन के दौरान मिटा दिए जाते हैं, इसलिए कोई रनटाइम लागत भी नहीं होनी चाहिए - यह स्थिर टाइपिंग के फायदों में से एक है। यह केवल तभी होता है जब आप एक प्रकार की कक्षा का उपयोग करते हैं जो रनटाइम मान को पास किया जा सकता है।

तो ज्यादातर मामलों में आप एक ही प्रदर्शन की उम्मीद कर सकते हैं, लेकिन आपको सूचियों जैसे कंटेनरों पर संचालन के बारे में थोड़ा सावधान रहना पड़ सकता है।

यदि आप स्वयं को जीएचसी 7.8 तक सीमित करते हैं, तो नया coerce फ़ंक्शन भी इससे मदद कर सकता है।

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

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