2012-06-17 13 views
5

मैं हैकेल में बीजगणित डीटी के बारे में सीख रहा हूं। मैं जो करना चाहता हूं वह एक नया एडीटी बनाता है जो कि मौजूदा "विस्तार" करता है। मुझे यह नहीं पता कि मैं जो चाहूं उसे व्यक्त करना है, क्या कोई वैकल्पिक पैटर्न को हल कर सकता है या समाधान हल कर सकता है। मैं चाहता हूं कि वे अलग-अलग प्रकार हों, लेकिन एक मूर्ख समाधान की तरह केवल सीमों की प्रतिलिपि बनाना और पेस्ट करना। नीचे दिया गया कोड सबसे अच्छा वर्णन करता है कि मैं क्या चाहता हूं।हास्केल के बीजगणितीय डेटा प्रकार: "छद्म-विस्तार"

data Power = 
    Abkhazia | 
    -- A whole bunch of World powers and semi-powers 
    Transnistria 
    deriving (Eq, Show) 

data Country = 
    --Everything in Power | 
    Netural | 
    Water 
    deriving (Eq, Show) 

संपादित करें: मुझे लगता है कि यह एक छोटे से स्पष्टीकरण की जरूरत है ... मैं इस (GHCi में) करने के लिए

let a = Abkhazia :: Country 

और नहीं

let a = Power Abkhazia :: Country 
+1

ऐसा करने के लिए आमतौर पर विचारों के ओओ-वाई स्कूल से आते हैं ;-), लेकिन आप पावर होल्ड्री के लिए देश के भीतर हमेशा एक कन्स्ट्रक्टर जोड़ सकते हैं। –

+0

हम्म मैं पूछ सकता हूं कि कैसे अब्खाज़िया और ट्रांसनिस्ट्रिया हास्केल कोड के टुकड़े में आते हैं? आप उन दो स्थानों से कैसे जुड़े हुए हैं? क्या आप किसी तरह के गेम पर काम कर रहे हैं? तुम किस देश से हो? –

+0

अबखाज़िया और ट्रांसनिस्ट्रिया http://en.wikipedia.org/wiki/List_of_sovereign_states पर "अन्य राज्यों" की सूची में पहला और आखिरी है। मैं सिर्फ हास्केल सीख रहा हूं और अभ्यास करने के लिए कुछ लेकर आया हूं। मुझे लगता है कि यह एक खेल हो सकता है, लेकिन मेरे पास अभी तक कोई इरादा नहीं है। –

उत्तर

8

आप की जरूरत है सक्षम होना चाहते हैं उन्हें पेड़ के रूप में प्रस्तुत करें:

data Power 
     = Abkhazia 
     | Transnistria 
    deriving (Eq, Show) 

    data Country 
     = Powers Power -- holds values of type `Power` 
     | Netural  -- extended with other values. 
     | Water 
    deriving (Eq, Show) 

संपादित करें: प्रश्न का आपका विस्तार थोड़ा आसान बनाता है: देश और पावर प्रकार दोनों "सामान्य" व्यवहार के रूप में कुछ सामान्य व्यवहार साझा करते हैं। यह सुझाव देता है कि आप डेटा प्रकार के सामान्य व्यवहार देने के लिए खुले, एक्स्टेंसिबल प्रकार प्रकार हास्केल की सुविधा का उपयोग करें। जैसे

data Power = Abkhazia | Transistria 

    data Countries = Neutral | Water 

तो, बातें दोनों पावर और देशों की हिस्सेदारी के लिए एक प्रकार वर्ग:

class Countrylike a where 
     landarea :: a -> Int -- and other things country-like entities share 

    instance Countrylike Power where 
     landarea Abkhazia = 10 
     landarea Transistria = 20 

    instance Countrylike Countries where 
     landarea Neutral  = 50 
     landarea Water  = 0 

तो आप landarea सफाई से या तो शक्तियों या देशों पर उपयोग कर सकते हैं। और आप इसे और उदाहरण जोड़कर भविष्य में नए प्रकारों तक बढ़ा सकते हैं।

+0

यह लगभग वही है जो मैं चाहता हूं, लेकिन स्पष्टीकरण को देखें। धन्यवाद! –

+1

@Raisdead आप haskell में _can't_ नहीं करते हैं, और डॉन को पता चलेगा, ... (हालांकि, आप उपप्रकार अनुकरण करने के लिए मल्टीपार्मामीटर प्रकार कक्षाओं का उपयोग कर सकते हैं, जो आपका मतलब हो सकता है। किसी भी मामले में, डॉन का जवाब शायद सबसे अच्छा है आप पाएंगे, और आपको क्या उपयोग करना चाहिए।) –

2
{-# LANGUAGE GADTs, StandaloneDeriving #-} 
data POWER 
data COUNTRY 

data CountryLike a where 
    Abkhazia :: CountryLike a 
    Transnistria :: CountryLike a 
    Netural :: CountryLike COUNTRY 
    Water :: CountryLike COUNTRY 

deriving instance Show (CountryLike a) 
deriving instance Eq (CountryLike a) 

type Power  = CountryLike POWER 
type Country = CountryLike COUNTRY 

foo :: Power 
foo = Abkhazia 

bar :: Country 
bar = Abkhazia 

baz :: Country 
baz = Netural 

संपादित करें: एक वैकल्पिक type Power = forall a. CountryLike a होगा (लाभ: बनाता है PowerCountry की एक उप-प्रकार नुकसान:। इस उदाहरण के Power -> Int एक उच्च रैंक प्रकार है, जो कष्टप्रद हो जाते हैं (प्रकार निष्कर्ष आदि) होगा)

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