2012-12-04 8 views
13

Sulzmann, चक्रवर्ती, और Peyton जोन्स द्वारा कागज "System F with Type Equality Coercions" निम्न उदाहरण के साथ हास्केल के newtype का अनुवाद प्रणाली एफसी में दिखाता है पैरामीट्रिकिटी के कारण MkT id और MkT undefined। अगर मैं इस (या एक समान) परिभाषा के लिए कुछ वास्तविक उपयोग करता हूं तो मैं उत्सुक हूं।क्या `newtype टी = एमकेटी (टी -> टी)` के लिए एक उपयोग केस है?</p> <pre><code>newtype T = MkT (T -> T) </code></pre> <p>मैं यह समझ के रूप में, <code>unsafePerformIO</code> को छोड़कर, इस प्रकार के ही संभव मान हैं:

उत्तर

20

पैरामीट्रिकिटी चर के साथ प्रकारों के मूल्यों के बारे में हैT में कोई चर नहीं है, इसलिए पैरामीट्रिकिटी लागू नहीं होती है। दरअसल, टी कई निवासियों

ap :: T -> T -> T 
ap (MkT f) t = f t 

idT :: T 
idT = MkT id 

constT :: T 
constT = MkT $ \t -> MkT $ \_ -> t 

axiom_sT :: T 
axiom_sT = MkT $ \f -> MkT $ \g -> MkT $ \a -> (g `ap` a) `ap` (f `ap` a) 

प्रकार TUntyped Lambda Calculus के एक कार्यान्वयन, बिजली में एक सार्वभौमिक औपचारिक प्रणाली बराबर एक ट्यूरिंग मशीन के लिए है। ऊपर दिए गए तीन कार्य (प्लस ap) एसकेआई कैलकुलेशन, समकक्ष औपचारिक प्रणाली बनाते हैं।

किसी भी हास्केल डेटाटाइप को T में एन्कोड करना संभव है। T

church :: Nat -> T 
church Zero  = MkT $ \f -> MkT $ \x -> x 
church (Succ n) = MkT $ \f -> MkT $ \x -> f `ap` (church n) 

में अब प्राकृतिक संख्या

data Nat = Zero | Succ Nat 

के लिए प्रकार हम Nat सांकेतिक शब्दों में बदलना कर सकते हैं पर विचार करें, तो आप हालांकि आंशिक रूप से सही है। हास्केल में इसके विपरीत कार्य लिखने का कोई तरीका नहीं है (जहां तक ​​मुझे पता है)। जो वास्तव में शर्म की बात है। यद्यपि आप T -> IO Nat प्रकार के साथ एक प्रकार का psuedo उलटा लिख ​​सकते हैं। साथ ही, मेरी समझ यह है कि जीएचसी ऑप्टिमाइज़र रिकर्सिव newtypes पर मर सकता है (अगर कोई इस बारे में गलत है तो कृपया मुझे सही करें, क्योंकि मैं उनका उपयोग करने के लिए वापस जाना चाहूंगा)।

इसके बजाय, प्रकार

data T = MkT (T -> T) | Failed String 

ap (MkT f) a = f a 
ap (Failed s) _ = Failed s 

साथ जो अपवादों के साथ लैम्ब्डा पथरी है, एक पूरी तरह invertable तरह से इस्तेमाल किया जा सकता है।

निष्कर्ष में, एक अर्थ में T एक उपयोगी प्रकार नहीं है, लेकिन एक और अर्थ में यह सभी का सबसे उपयोगी प्रकार है।

+0

मेरे भ्रम को स्पष्ट करने के लिए धन्यवाद। –

+0

दुर्भाग्यवश आप गलत नहीं हैं - कम से कम, जीएचसी 7.6 का इनलाइनर नकारात्मक पुनरावृत्ति वाले प्रकारों से जुड़े कुछ अभिव्यक्तियों पर घबरा सकता है (यह 'डेटा' के साथ-साथ' newtype') के साथ भी हो सकता है। सकारात्मक रिकर्सन - यानी '->' के दायीं तरफ - ठीक होना चाहिए, यद्यपि। – shachaf

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