2012-03-11 18 views
0

У меня есть следующие для HTML шрифта тега:Типы 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? Это ваша забота? Кстати, вам не нужны парсеры вокруг [FontAttribute]. –

ответ

1

Цвет - это всего лишь тип, а не атрибут. В системе типов нет ничего, чтобы указать, что у Цвет есть особые отношения с FontAttribute. Все, что происходит, когда вы определяете тип данных FontAttribute является то, что он создает конструктор под названием FontColor, который является обычной функцией со следующей сигнатурой типа:

FontColor :: Color -> FontAttribute 

Так что, если вы объявили какой-то новый тип под названием Link:

data LinkAttrubute = LinkColor Color | ... 

Затем цвет также может быть сохранен в LinkAttribute. Конструктор не подразумевает исключительную связь только с этим типом данных. Весь ваш тип данных FontAttribute говорит, что он МОЖЕТ содержать только цвет.

Haskell не имеет встроенной концепции атрибутов, потому что у нее нет встроенной концепции объектов. ОДНАКО, вы можете моделировать атрибуты с использованием типа Lens из пакета данных (или fclabels). Я бы связал вам пакеты, но я нахожусь на своем телефоне, и это сложно.

+0

Спасибо, это то, что я хотел. Вы хотите, чтобы цвет был общим и применимым к любому конструктору данных. –

Смежные вопросы