2012-03-11 102 views
0

一個HTML字體標籤我有以下幾點:哈斯克爾代數數據類型

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

是否可以創建由任何數字和組合或FontAttribute描述的Font? '字體[臉部「宋體」,臉部「影響」]'似乎並不是非常有用...... – delnan 2012-03-11 16:32:00

+0

是的,任何有效的列表。你可以在XHTML和CSS中做同樣的事情,我認爲會發生什麼是依賴於實現。通常瀏覽器使用最後一個值。我更關心類型層面。 – 2012-03-11 16:35:04

+0

所以,你想限制「顏色」專用於FontColor構造函數?這是你的擔心嗎? 順便說一句,你不需要[FontAttribute]周圍的parens。 – 2012-03-12 01:10:48

回答

1

顏色只是一種類型,而不是屬性。類型系統中沒有任何內容表明Color與FontAttribute有任何特殊關係。所有在定義FontAttribute數據類型是它創建了一個名爲FONTCOLOR構造函數是以下類型簽名普通函數出現這種情況:

FontColor :: Color -> FontAttribute 

所以,如果你宣佈了一些新的類型,稱爲鏈接:

data LinkAttrubute = LinkColor Color | ... 

然後Color也可以存儲在LinkAttribute中。構造函數並不意味着只與該數據類型有排他關係。所有的FontAttribute數據類型都表示它可能只包含一個Color。

Haskell沒有內置的屬性概念,因爲它沒有內置的對象概念。但是,您可以使用數據透鏡(或fclabels)包中的透鏡類型對屬性進行建模。我會聯繫你的包裹,但我在我的手機上,這是困難的。

+0

謝謝,這就是我想要的。你會希望Color是通用的,並且適用於任何數據構造函數。 – 2012-03-12 09:45:23