2010-10-30 12 views
9

मान लीजिए हम प्रकार की तुलना के लिए एक GADT परिभाषितरनटाइम तुलना

eqt :: (Typeable a, Typeable b) => a -> b -> Maybe (EQT a b) 

... ऐसा है कि eqt xyबस गवाह का मूल्यांकन करता है, तो typeof एक्स == टी ypeOf y --- और अन्यथा कुछ भी नहीं?

फ़ंक्शन eqt सामान्य पॉलीमोर्फिक डेटा संरचनाओं को जीएडीटी में उठाना संभव बनाता है।

उत्तर

11

हां यह है। यहां एक तरीका है:

पहला, प्रकार-समानता प्रकार।

data EQ :: * -> * -> * where 
    Refl :: EQ a a -- is an old traditional name for this constructor 
    deriving Typeable 

ध्यान दें कि इसे स्वयं टाइप करने योग्य का उदाहरण बनाया जा सकता है। यही कुंजी है। अब मुझे इस तरह की जरूरत पड़ने पर मुझे अपने हाथों की आवश्यकता है।

refl :: a -> EQ a a 
refl _ = Refl 

और अब मैं चालू करने के लिए (REFL :: Eq एक क) (Eq एक ख) प्रकार के कुछ Data.Typeable के कलाकारों ऑपरेटर का उपयोग करके में की कोशिश कर सकते हैं। यह तब काम करेगा जब ए और बी बराबर हैं!

eq :: (Typeable a, Typeable b) => a -> b -> Maybe (EQ a b) 
eq a _ = cast (refl a) 

कड़ी मेहनत पहले ही हो चुकी है।

इस विषय पर अधिक विविधताएं डेटावॉट लाइब्रेरी, में पाई जा सकती हैं लेकिन डेटा। टाइप करने योग्य कास्ट ऑपरेटर आपको इस नौकरी के लिए आवश्यक है। यह निश्चित रूप से धोखाधड़ी है, लेकिन सुरक्षित रूप से धोखाधड़ी पैक किया गया है।

+0

यह साफ है! धन्यवाद। –

+0

सुरक्षित रूप से तब तक पैक किया गया जब किसी ने किसी चीज़ पर गलत 'डेटा टाइप करने योग्य' उदाहरण नहीं बनाया। ('टाइप करने योग्य' प्राप्त करना हमेशा सुरक्षित है।) –

+0

ध्यान दें कि इन दिनों 'eq'' data.Typeable' मॉड्यूल में उपलब्ध है ['eqT'] (https://hackage.haskell.org/package/base-4.9 .0.0/docs/डाटा-Typeable.html # v: eqt) –