2014-06-26 8 views
11

DataKinds के साथ, जैसेक्या कोई कारण है कि हम डेटाकिंड्स के साथ प्रकारों को पॉप्युलेट नहीं कर सकते हैं?

data KFoo = TFoo 

एक परिभाषा तरह KFoo :: BOX और प्रकार TFoo :: KFoo परिचय देता है। क्यों नहीं मैं तो

data TFoo = CFoo 

ऐसी है कि CFoo :: TFoo, TFoo :: KFoo, KFoo :: BOX परिभाषित करने के लिए पर जा सकते हैं?

क्या सभी रचनाकारों को * से संबंधित किसी प्रकार से संबंधित होना चाहिए? यदि हां, तो क्यों?

संपादित: जब मैं यह कर मैं कोई त्रुटि मिलती नहीं है, क्योंकि निर्माणकर्ता और प्रकार एक नाम स्थान साझा करते हैं, लेकिन क्योंकि यह नियमित प्रकार के बजाय पदोन्नत कंस्ट्रक्टर्स के रूप में नाम स्पष्ट रूप से दिखाता GHC संघर्ष अनुमति देता है। प्रमोटेड कन्स्ट्रक्टर को संदर्भित करने के लिए दस्तावेज़ ' के साथ उपसर्ग करने के लिए कहते हैं। जब मैं

data 'TFoo = CFoo 

करने के लिए बदल कि दूसरी पंक्ति मैं त्रुटि प्रकार या वर्ग घोषणा के

विकृत सिर मिलती है: TFoo

+0

'डेटा TFoo' को परिभाषित करने का प्रयास करते समय आपको क्या त्रुटि मिलती है? – cdk

उत्तर

9

सभी कंस्ट्रक्टर्स एक प्रकार के हैं की जरूरत है यह * के प्रकार से संबंधित है?

हां। यह वही है जो * का अर्थ है: यह है (उठाया/बॉक्स किया गया, मैं उस भाग के बारे में कभी भी निश्चित नहीं हूं) हास्केल प्रकार। वास्तव में अन्य सभी प्रकार वास्तव में प्रकार के प्रकार नहीं हैं हालांकि वे type वाक्यविन्यास साझा करते हैं। इसके बजाय * मेटाटाइप-स्तरीय प्रकार प्रकारों के लिए है, और अन्य सभी प्रकार मेटाटाइप-स्तरीय प्रकार हैं जो कि प्रकार नहीं हैं लेकिन रचनाकार या कुछ अलग टाइप करें।

(फिर से, वहाँ भी अनबॉक्स्ड प्रकार प्रकार के बारे में कुछ है,। उन निश्चित प्रकार के होते हैं, लेकिन मुझे लगता है कि यह एक data निर्माता के लिए संभव नहीं है)

+3

आमतौर पर मैं एक ही पोस्ट में "टाइप" शब्द टाइप नहीं करता। – leftaroundabout

+1

'*' सभी प्रकार के उठाए गए प्रकार हैं और '#' अनलिफ्ट है। '*' और '#' एक साथ सभी प्रकारों को समाहित करता है जिनमें मूल्य हैं।बॉक्सिंग सिर्फ यह दर्शाता है कि कुछ पॉइंटर है या नहीं, मुझे विश्वास है। – user2407038

+2

बॉक्स किए गए, अनबॉक्स किए गए प्रकारों का प्रकार '#' है, यही कारण है कि आप उन्हें पॉलिमॉर्फिक फ़ंक्शंस में उपयोग नहीं कर सकते हैं, तरह से मेल नहीं खाते हैं। वहां '' 'भी है जो सभी प्रकार के शीर्ष और' ?? 'है जो' * 'और' # 'का केंद्र है। – jozefg

6

सभी कंस्ट्रक्टर्स एक प्रकार के हैं की जरूरत है कि दयालु * से संबंधित है? यदि हां, तो क्यों? DataKinds संकलन के दौरान मिट हो:

सबसे महत्वपूर्ण कारण है कि वे प्रकार * (या #) का होना चाहिए चरण जुदाई GHC द्वारा नियोजित है। हम उन्हें केवल परोक्ष रूप से रनटाइम, सिंगलटन GADT डेटाटाइप्स को परिभाषित करते हुए प्रतिनिधित्व कर सकते हैं:

{-# LANGUAGE DataKinds #-} 

data Nat = Z | S Nat 

data SNat n where 
    SZ :: SNat Z 
    SS :: SNat n -> SNat (S n) 

लेकिन DataKind सूचकांक खुद को अभी भी क्रम मौजूद नहीं हैं। विभिन्न प्रकार चरण पृथक्करण के लिए एक सरल नियम प्रदान करते हैं, जो आश्रित प्रकारों के साथ सीधा नहीं होगा (भले ही यह संभावित रूप से प्रकार स्तर प्रोग्रामिंग को सरल बनाये)।

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

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