2012-04-11 7 views
5

मैं हाल ही में "मुझे एक हास्केल सीखने" की कोशिश कर रहा हूं, और मैं कच्चे इंटीजर (टाइप सुरक्षा और कोड स्पष्टता के लिए) के बिना, एक पूर्णांक स्थिति का प्रतिनिधित्व करने के लिए एक नया प्रकार बनाना चाहता हूं। विशेष रूप से, निम्न कोड को संकलित करता है:हास्केल प्रकार "इंटीग्रल प्राप्त करने" को "एनम प्राप्त करने" की आवश्यकता क्यों है?

newtype AuxState = AuxState Integer 
    deriving (Eq, Ord, Num, Integral, Real, Enum) 

हालांकि, बाद से वहाँ अपने आवेदन में राज्यों की एक अनंत संख्या में हैं, मैं एक Enum में इस राज्य परिवर्तित करने में कोई दिलचस्पी नहीं है। हालांकि, अगर मैं deriving (Enum) बयान को दूर करने के तो यह सिर्फ deriving (Eq, Ord, Num, Integral, Real) है कोशिश, संकलक शिकायत:

No instance for (Enum AuxState) 
    arising from the 'deriving' clause of a data type declaration 
Possible fix: 
    add an instance declaration for (Enum AuxState) 
    or use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
When deriving the instance for (Integral AuxState) 

मैं यह विश्वास करना कठिन है कि हास्केल इंटीग्रल कक्षा में एक प्रकार बलों भी Enum कक्षा में रहने के लिए मिल; क्या यह सिर्फ दूसरी तरफ नहीं होना चाहिए? क्या इसके लिए कोई कारण है, या क्या मैं कुछ गलत कर रहा/समझ रहा हूं? क्योंकि Integral गणित की नींव succ और pred संचालन कर रहे हैं

+2

एनम उदाहरण अनुक्रमिक रूप से आदेशित प्रकार हैं-उनके मूल्यों का आकलन किया जा सकता है। एनम प्रकार वर्ग का मुख्य लाभ यह है कि हम सूची मूल्यों में अपने मूल्यों का उपयोग कर सकते हैं। उन्होंने उत्तराधिकारी और पूर्ववर्ती भी परिभाषित किए हैं, जिन्हें हम succ और pred fuctions के साथ प्राप्त कर सकते हैं। मेरा मानना ​​है कि सभी पूर्णांक इस वर्ग से संबंधित होना चाहिए, आपका क्यों नहीं होना चाहिए? –

+1

"हालांकि, चूंकि मेरे आवेदन में असीमित राज्य हैं, ..." मुझे लगता है कि आपको 'एनम' की गलत समझ है। 'एनम' का मतलब मानों की सीमित संख्या वाला एक प्रकार नहीं है। – newacct

+1

"क्या यह सिर्फ दूसरी तरफ नहीं होना चाहिए?" 'डबल' एक 'एनम' है, लेकिन जाहिर है कि 'इंटीग्रल' – newacct

उत्तर

8

सभी Integral जरूरी Enum हैं। (तकनीकी रूप से Enum एक उचित प्रकार पदानुक्रम के लिए खड़ा है जहां Integral प्रकार गणितीय सेमिग्रुप है, मुझे लगता है।) दूसरी तरफ और भी गलत लगता है: आपका मतलब है कि हर EnumIntegral होना चाहिए? क्या इसमें

data Foo = A | B | C | D | E | F | G deriving (Enum) 

जैसे यादृच्छिक एडीटी शामिल हैं?

(हर EnumIntegral, निश्चित रूप से के एक सबसेट isomorphic को होना चाहिए, लेकिन यह है कि वास्तव में यह दूसरी दिशा जा रहा पता चलता है:। Integral किसी भी Enum लेकिन ठीक इसके विपरीत है, तो Integral ur- Enum की तरह है प्रतिनिधित्व कर सकते हैं)

क्योंकि इस प्रकार है क्योंकि Integral Prelude में परिभाषित किया गया है
+0

मैं नहीं कहूंगा कि 'इंटीग्रल' एक सेमिग्रुप है। यह एक यूक्लिडियन डोमेन (यानी अंगूठी की एक अच्छी किस्म) है, लेकिन कुछ अतिरिक्त प्रतिबंधों के साथ। –

6

तकनीकी कारण है:

class (Real a, Enum a) => Integral a where 
    ... 

गणितीय कारण यह है कि हर अभिन्न प्रकार गणनीय लेकिन है नहीं है इसके विपरीत टी। उदाहरण के लिए तर्कसंगत संख्याओं के बारे में सोचें। ध्यान दें, कि एनम Integer द्वारा दिखाए गए अनुसार सीमित गणना का संकेत नहीं देता है।

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

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