2011-09-04 18 views
15

के भीतर बाध्य प्रकार कैसे बनाएं, मैं एक नया अभिन्न प्रकार बनाना चाहता हूं जो एक निश्चित सीमा से जुड़ा हुआ है। मैंने कोशिश की है:किसी निश्चित श्रेणी

data PitchClass = PC Int deriving (Ord, Eq, Show) 

instance Bounded PitchClass where 
    minBound = PC 0 
    maxBound = PC 11 

हालांकि, मैं क्या चाहते हैं कुछ है कि अगर कुछ

तरह
PC 12 

या

PC (-1) 

का प्रयास किया है असफल हो जायेगी है।

एक ऐसी स्थिति के लिए सामान्य दृष्टिकोण है जिसमें आप नए प्रकार के निर्माण पर बाधा डालना चाहते हैं जिसमें मूल्य रचनाकार मॉड्यूल से निर्यात नहीं किए जाते हैं, बल्कि ऐसे कार्यों जो प्रकार के उदाहरण लौटाते हैं और जो बाधा जांच करते हैं निर्यात?

उत्तर

14

हां, मॉड्यूल से डेटा कन्स्ट्रक्टर को निर्यात नहीं करना रास्ता है।

इसके बजाए, आप एक फ़ंक्शन निर्यात करते हैं जो आपने कहा था। इसे अक्सर smart constructor कहा जाता है।

5

उन मामलों के लिए एक वैकल्पिक समाधान जहां कुल मूल्यों की संख्या यह छोटा है, केवल संभावित रचनाकारों को गिनना है।

data PitchClass = A | Bb | B | C | Db | D | Eb | E | F | Gb | G | Ab 
    deriving (Eq, Ord, Bounded, Show, Read) 

आधा दर्जन अलग हैक आप विभिन्न तरीकों से इसे अधिक सुविधाजनक बनाने के लिए यहां से कोशिश कर सकते हैं; उदाहरण के लिए, toEnum . fromEnum = id (और toEnum (-1) = {- an exception -}) प्राप्त करने के लिए आप Enum प्राप्त कर सकते हैं, या 0 = A (और -1 के लिए व्यवहार की अपनी पसंद) प्राप्त करने के लिए आप एक कस्टम Integral उदाहरण लिख सकते हैं।

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