2012-03-11 5 views
0

:하스켈 대수 데이터 형식

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는 모든 종류의 태그에 대한 일반 유형 속성이며 특정 태그에는 특정 속성 하위 집합이 있습니다 (이 경우 글꼴에는 FontAttribute가 있으며 Size, Face 또는 FontColor 일 수 있음). 이것을 표현하는 명확한 방법이 있습니까, 아니면 구현 사운드입니까?

+0

'Font'를 임의의 수와 조합 또는 'FontAttribute'로 설명하도록 만들 수 있습니까? 'Font [Face "Arial", Face "Impact"]'끔찍한 도움이되지는 않습니다 ... – delnan

+0

네, 유효한 목록입니다. XHTML과 CSS에서도 동일한 작업을 수행 할 수 있습니다. 구현에 따라 다릅니다. 일반적으로 브라우저는 마지막 값을 사용합니다. 나는 유형의 계층에 대해 더 염려했다. –

+0

그래서 FontColor 생성자와 독점적으로 사용되는 "Color"를 제한하고 싶습니까? 그것이 당신의 걱정입니까? 그런데 [FontAttribute] 주변에 괄호가 필요하지 않습니다. –

답변

1

색상은 속성이 아닌 유형입니다. 색상이 FontAttribute와 특별한 관계가 있음을 나타 내기 위해 유형 시스템에는 아무것도 없습니다.

data LinkAttrubute = LinkColor Color | ... 
: 당신은 몇 가지 새로운 형태라는 링크를 선언한다면

FontColor :: Color -> FontAttribute 

: 당신이 FontAttribute 데이터 형식은 다음과 같은 유형의 서명과 일반 기능입니다 FONTCOLOR라는 생성자를 생성하는 것입니다 정의 할 때 일어나는 모든

그러면 Color를 LinkAttribute에도 저장할 수 있습니다. 생성자는 해당 데이터 유형과의 배타적 인 관계를 의미하지 않습니다. 모든 FontAttribute 데이터 유형은 단지 색상 만 포함 할 수 있습니다.

하스켈은 객체에 대한 기본 개념이 없기 때문에 속성에 대한 기본 개념이 없습니다. 그러나 데이터 렌즈 (또는 fclabels) 패키지의 Lens 유형을 사용하여 특성을 모델링 할 수 있습니다. 나는 당신에게 꾸러미를 링크 할 것이다. 그러나 나는 나의 전화 위에있다. 그리고 그것은 어렵다.

+0

고마워, 그게 내가 원하는거야. Color를 제네릭으로 만들고 모든 데이터 생성자에 적용 할 수 있습니다. –