2012-04-23 16 views
6

मेरे पास एक डेटा प्रकार है जिसे मैं डेटाकिंड्स के माध्यम से ghc 7.4.1 और एक दिए गए टाइपक्लास के माध्यम से प्रचारित करता हूं जिसे मैं टाइप विशिष्ट संचालन करने के लिए उपयोग करना चाहता हूं।प्रचारित प्रकार के टाइपक्लास उदाहरण कैसे बनाएं?

data Type = TInt32 | TInt64 | TInt16 
class TypeTraits a where 
    ... 

और फिर मैं तो जैसे पदोन्नत प्रकार के typeclass उदाहरणों बनाने का प्रयास करें:

Kind mis-match 
The first argument of `TypeTraits' should have kind `*', 
but `TInt32' has kind `Type' 
In the instance declaration for `TypeTraits TInt32' 

निर्दिष्ट करने के द्वारा इसे ठीक करने की कोशिश कर रहा:

instance TypeTraits TInt32 where 
    ... 

मैं निम्न प्रकार की त्रुटियों मिल 'ए' की तरह:

class TypeTraits (a :: Type) where 
    ... 

Kind mis-match 
Expected kind `ArgKind', but `a' has kind `Type' 
In the type `a -> String' 
In the class declaration for `TypeTraits' 
+0

आप वास्तव में '...' क्षेत्र में क्या डाल सकते हैं? 'TInt32' एक निवास प्रकार नहीं है, इसलिए यह एक मूल्य स्थिति में 'ए' का उपयोग नहीं कर सकता है। मुझे लगता है कि 'crazyThing :: TypeTraits a => SomeTypeConstructor a' जैसा कुछ अनुमान लगा रहा हूं? मुझे यह समझने में कठिनाई हो रही है कि इस तरह कुछ कैसे उपयोगी हो सकता है, हालांकि अगर मैं वास्तव में फैलता हूं, तो मैं कल्पना कर सकता हूं कि यह उपयोगी * किसी भी तरह * है। शायद। –

+0

विचार प्रत्येक उदाहरण के लिए लक्षण होना था। इसलिए मैं मूल्य की तलाश नहीं कर रहा हूं, लेकिन टाइपक्लास निर्दिष्ट करने के लिए केवल प्लेसहोल्डर और इसके परिणामस्वरूप वह कार्य जिसे मैं वहां चुनना चाहता हूं। उदाहरण के लिए: 'क्लास टाइपट्रेट्स (ए :: टाइप) जहां टाइप टाइप करें एचटी टाइप करें :: प्रॉक्सी ए -> Int' – Chetan

उत्तर

7

समस्या वर्ग के शरीर में है; जिन प्रकारों में एक उठाए गए प्रकार के पास कोई मूल्य नहीं है, इसलिए आपके पास कोई ऐसा फ़ंक्शन नहीं हो सकता है जो पैरामीटर के रूप में लेता है। आपको Proxy a -> String या इसी तरह का उपयोग करना होगा।

वैसे, यदि आप PolyKinds एक्सटेंशन चालू करते हैं तो आपको पूरी तरह से एनोटेशन को छोड़ने में सक्षम होना चाहिए। (असल में, आपको अपना खुद का Proxy प्रकार परिभाषित करने के लिए ऐसा करना पड़ सकता है, क्योंकि मुझे लगता है कि डेटा.प्रॉक्सी से * -> * हो सकता है, जबकि आपको Type -> * की आवश्यकता है। यदि आप data Proxy p = Proxy को PolyKinds पर परिभाषित करते हैं, तो इसे अनुमानित किया जाएगा AnyK -> *।)

+1

[पेपर] में प्रॉक्सी डेटाटाइप (http://research.microsoft.com/en-us/ लोग/dimitris/fc-kind-poly.pdf) अंत में समझ में आता है, धन्यवाद! – Chetan

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