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> को छोड़कर, इस प्रकार के ही संभव मान हैं:
उत्तर
पैरामीट्रिकिटी चर के साथ प्रकारों के मूल्यों के बारे में है। 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)
प्रकार T
Untyped 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
एक उपयोगी प्रकार नहीं है, लेकिन एक और अर्थ में यह सभी का सबसे उपयोगी प्रकार है।
- 1. सी # इंटरफ़ेस <T> {टी समारोह <T> (टी टी);}: जेनेरिक वापसी प्रकार
- 2. टाइपोफ (टी) बनाम <T>
- 3. विभिन्न <T>
- 4. कक्षा <T> से टाइप रीफरेंस <T>
- 5. एक्शन <T> या एक्शन <in T>?
- 6. सार्वजनिक स्थैतिक <T> टी addandReturn (टी तत्व, संग्रह <T> संग्रह) में <T> का उपयोग क्या है {
- 7. सी #, objectCollection.OfType <T>() और foreach (ऑब्जेक्ट कोलेक्शन में टी आइटम), IENumerable <T>
- 8. .CreateObjectSet <T>, .Set <T>, और .reateQuery <T> के बीच अंतर।
- 9. DataContext.ExecuteQuery <T>
- 10. IQueryable OfType <T> जहां टी एक रनटाइम प्रकार
- 11. IList <T> बनाम IENumerable <T>। अधिक कुशल IList <T> या IENumerable <T>
- 12. अभिव्यक्ति <Func<T,bool>> अभिव्यक्ति से <Func<T>>
- 13. कैसे IObservable <T>
- 14. invokeAll() <Callable<T>>
- 15. <T>
- 16. IList <T> और सूची <T> इंटरफेस
- 17. संग्रह <T> उपयोग करने के लिए जब सूची बनाम <T>
- 18. <?> बनाम <T>
- 19. सूची <T>
- 20. सी # हैशसेट <T> खोज प्रदर्शन (एक पर्यवेक्षण चयन <T> की तुलना में)?
- 21. कार्यान्वयन IComparable <T>
- 22. IEnumerable <T> रूपांतरण
- 23. IList <T> IQueryable <T>
- 24. आईएलआईस्ट <T>
- 25. आप इंटरफेस के लिए कौन सा पसंद करते हैं: टी [], आईनेमेरेबल <T>, IList <T>, या अन्य?
- 26. एक्शन <T>
- 27. सी # कार्यान्वयन IEquatable <T> .Equal <T>
- 28. सी # शब्दकोश के लिए फ्लैट सूची <T> विस्तृत <टी, ICollection <int>>
- 29. सूची <T>
- 30. कार्रवाई <T> पैरामीटर
मेरे भ्रम को स्पष्ट करने के लिए धन्यवाद। –
दुर्भाग्यवश आप गलत नहीं हैं - कम से कम, जीएचसी 7.6 का इनलाइनर नकारात्मक पुनरावृत्ति वाले प्रकारों से जुड़े कुछ अभिव्यक्तियों पर घबरा सकता है (यह 'डेटा' के साथ-साथ' newtype') के साथ भी हो सकता है। सकारात्मक रिकर्सन - यानी '->' के दायीं तरफ - ठीक होना चाहिए, यद्यपि। – shachaf