我有以下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)]
我担心的是,类型为FontAttribute的FontColor
数据/值构造函数需要Color类型作为参数。这意味着Color是任何类型标记的泛型类型属性,并且特定标记具有特定的属性子集(在这种情况下,Font具有FontAttribute,可以是Size,Face或FontColor)。是否有更明确的方式来表达这一点,或者我的实施是否合理?
答案 0 :(得分:1)
颜色只是一种类型,而不是属性。类型系统中没有任何内容表明Color与FontAttribute有任何特殊关系。定义FontAttribute数据类型时发生的所有事情是它创建一个名为FontColor的构造函数,它是一个具有以下类型签名的普通函数:
FontColor :: Color -> FontAttribute
因此,如果您声明了一些名为Link的新类型:
data LinkAttrubute = LinkColor Color | ...
然后Color也可以存储在LinkAttribute中。构造函数不表示仅与该数据类型的排他关系。所有FontAttribute数据类型都表示它可能只包含一个Color。
Haskell没有内置的属性概念,因为它没有内置的对象概念。但是,您可以使用数据镜头(或fclabels)包中的镜头类型对属性建模。我会把你的包裹链接起来,但是我在手机上却很困难。