2012-03-11 18 views
0

Haskellの代数的データ型

data Color = HexColor Int | RGBColor Int Int Int | ColorString String deriving Show 
data FontAttribute = Size Int | Face String | FontColor Color deriving Show 
data Font = Font [FontAttribute] deriving Show 

私はそうのようなものを構築する:

Font [Size 23,Face "Arial",Color (RGBColor 240 23 43)] 

私の関心は持っていFontColorデータ/値のコンストラクタが入力することですFontAttributeには引数としてColor型が必要です。つまり、Colorは任意の種類のタグのジェネリック型属性であり、特定のタグは特定の属性のサブセットを持っています(この場合、FontにはFontAttributeがあり、Size、Face、FontColorなどがあります)。これを表現する明確な方法はありますか、それとも実装のサウンドですか?

+0

「Font」を任意の数や組み合わせ、または「FontAttribute」で記述することができますか? 'Font [Face" Arial "、Face" Impact "]'はあまり役に立たないようです... – delnan

+0

はい、有効なリストです。あなたはXHTMLとCSSで同じことをすることができます。私は、実装に依存していると思います。通常、ブラウザは最後の値を使用します。私はより多くのタイプの階層を心配していました。 –

+0

したがって、FontColorコンストラクタで排他的に使用されるために、「Color」を制限したいのですか?それはあなたの懸念ですか? ところで、あなたは[FontAttribute]の周りに括弧は必要ありません。 –

答えて

1

色は単なる属性ではなくタイプです。型システムには、ColorがFontAttributeと特別な関係を持つことを示すものは何もありません。

data LinkAttrubute = LinkColor Color | ... 
:あなたには、いくつかの新しいタイプと呼ばれるリンクを宣言したのであれば

FontColor :: Color -> FontAttribute 

:あなたはFontAttributeデータ型は、それが次の型シグネチャを持つ通常の関数であるFONTCOLORと呼ばれるコンストラクタを作成することです定義するときに起こるすべてのこと

次に、ColorをLinkAttributeに格納することもできます。コンストラクタは、そのデータ型との排他関係を意味するものではありません。すべてのFontAttributeデータ型には、ただ1つの色だけが含まれていることがあります。

ハスペルには、オブジェクトの組み込み概念がないため、属性の組み込み概念がありません。ただし、データ・レンズ(またはfclabels)パッケージのLensタイプを使用して属性をモデル化できます。私はあなたにパッケージをリンクしますが、私は私の電話の上にあり、それは難しいです。

+0

ありがとう、それは私が欲しかったものです。 Colorをジェネリックにし、任意のデータコンストラクタに適用することをお勧めします。 –

関連する問題