सभी ADTS isomorphic (लगभग - अंत देखें) (,)
, Either
, ()
, (->)
, Void
और Mu
के कुछ संयोजन के लिए जहां
data Void --using empty data decls or
newtype Void = Void Void
और Mu
एक functor की fixpoint गणना करता
newtype Mu f = Mu (f (Mu f))
उदाहरण के लिए
data [a] = [] | (a:[a])
रूप
data [a] = Mu (ListF a)
data ListF a f = End | Pair a f
ही है जो अपने आप में
data Maybe a = Nothing | Just a
के बाद से
newtype ListF a f = ListF (Either() (a,f))
isomorphic को है
newtype Maybe a = Maybe (Either() a)
isomorphic को है
आप
newtype ListF a f = ListF (Maybe (a,f))
जो
data List a = List (Maybe (a,List a))
और अपनी परिभाषा के म्यू में inlined जा सकती है
data List a = List a (Maybe (List a))
सिर्फ म्यू का खुलासा और बाहरी के उन्मूलन है हो सकता है कि (गैर-खाली सूचियों के अनुरूप)
और आप कर रहे हैं ...
बातें
कस्टम ADTS का उपयोग की एक जोड़ी बढ़ जाती है स्पष्टता और प्रकार सुरक्षा
यह सार्वभौमिकता उपयोगी है: देखने GHC.Generic
ठीक है, मैं लगभग isomorphic कहा। यह बिल्कुल नहीं है, अर्थात्
hmm = List (Just undefined)
सूचियों का [a] = [] | (a:[a])
परिभाषा कोई समकक्ष मूल्य है। ऐसा इसलिए है क्योंकि हास्केल डेटा प्रकार coinductive हैं, और a point of criticism of the lazy evaluation model रहा है। आप इन समस्याओं को चारों ओर केवल सख्त रकम और उत्पादों का उपयोग करके प्राप्त कर सकते हैं (और मूल्य कार्यों से कहते हैं), और एक विशेष "लेज़ी" डेटा निर्माता
data SPair a b = SPair !a !b
data SEither a b = SLeft !a | SRight !b
data Lazy a = Lazy a --Note, this has no obvious encoding in Pure CBV languages,
--although Laza a = (() -> a) is semantically correct,
--it is strictly less efficient than Haskell's CB-Need
और फिर सभी Isomorphisms ईमानदारी से एन्कोड किया जा सकता जोड़ने।
'Sup dawg मैं तुम्हें monads की तरह सुना, तो मैं अपने इकाई में एक इकाई डाल ...! आप 'देखा है हो सकता है कि स्ट्रिंग' यह प्रकार के वास्तव में है' शायद [चार] ', लेकिन मुझे लगता है कि आप इकाई ट्रांसफार्मर पुनर्रचना कर रहे हैं (http://en.wikibooks.org/wiki/Haskell/Monad_transformers देखें) लेकिन मैं कर रहा हूँ यकीन नहीं है क्योंकि मैं अभी खुद मोनैड्स से परिचित नहीं हूं। – epsilonhalbe
ओह, मैंने कई 'शायद स्ट्रिंग' (http://www.haskell.org/hoogle/?hoogle=Maybe+%5BChar%5D) कहीं भी देखा] लेकिन उनके पास एक अलग अर्थ है। मैंने अभी बताया कि '[] 'एक प्रकार का' कुछ भी नहीं 'और सामान है, इसलिए मैंने" पुनः परिभाषा "को हटाने के लिए' कुछ भी नहीं 'का उपयोग करने के बारे में सोचा। – L01man
यह पुनर्वितरण नहीं है। मोनाड्स के रूप में उपयोग किए जाने पर सूची और शायद अलग-अलग अर्थशास्त्र हो सकते हैं। लाइन को धुंधला करने और सिंटैक्स चीनी (विशेष रूप से सूची पैटर्न) को फेंकने से भी बेवकूफ बेवकूफ है। –