2012-06-17 17 views
5

私はhaskellの代数的DTについて学んでいます。私がしたいことは、既存のものを「拡張」するような新しいADTを作成することです。私は、私が好きなものを表現する方法を見つけることができない、誰かが代替パターンを甘受することができるか、解決策を甘くすることができる。私はそれらを別々のタイプにしたいが、ばかばかしいソリューションのように縫い目だけをコピーして貼り付ける。以下のコードは、私が探しているものを最もよく表しています。ハスケルの代数的データ型: "pseudo-extend"

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) 

編集:私は

let a = Abkhazia :: Country 

なく

let a = Power Abkhazia :: Country 
+1

これをやりたい理由は、通常、OO-yの考え方から来ていますが、電源を保有するPowerCountryのコンストラクタをCountry内に追加することはいつでも可能です。 –

+0

うーん、アブハジアとトランスナストリアがハスケルのコードにどうやって来るのか聞いてもいいですか?あなたはその2つの場所とどのように関係していますか?あなたは何らかのゲームに取り組んでいますか?どこから来ましたか? –

+0

AbkhaziaとTransnistriaはhttp://en.wikipedia.org/wiki/List_of_sovereign_statesの「その他の州」のリストの最初と最後です 私はちょうどハスケルを学んでいて、練習することを考え出しました。私はそれがゲームになるかもしれないと思うが、私はまだ意図はない。 –

答えて

8

あなたがする必要がある。この(GHCiの中で)行うことができるようにしたい...それは少し説明が必要だと思いますそれらをツリーとして表します。

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) 

編集:質問へのあなたの拡張はこれを少し簡単にします:国と電源タイプの両方が "国"としていくつかの共通の行動を共有します。これは、データ型に対して一般的な振る舞いを与えるために、オープンで拡張可能なタイプのクラスのHaskellの機能を使用することを示しています。例えば。その後、

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あなたはハスケルでそれをすることはできません.Donは知っています...(ただし、マルチパラメータ型のクラスを使ってサブタイプをシミュレートすることができます。あなたは得るでしょう、そしてあなたは何を使うべきですか?) –

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迷惑になる傾向があり、上位タイプなど(型推論)になるだろう)

関連する問題