하스켈을 배우면서, 나는 C++ 헤더 파일의 포맷터를 작성한다. 먼저, 모든 클래스 멤버를 -a-collection-of-class-members으로 구문 분석 한 다음 서식 지정 루틴으로 전달합니다. 내가 하스켈의 데이터 유형 디자인
data ClassMember = CmTypedef Typedef |
CmMethod Method |
CmOperatorOverload OperatorOverload |
CmVariable Variable |
CmFriendClass FriendClass |
CmDestructor Destructor
이 클래스 멤버를 표현하기 위해 (때문에 나는 포맷 스타일의 일부 특수성의 클래스 회원이 방법을 분류 할 필요가있다.)
날 귀찮게 문제입니다 어떤 기능을 "드래그"에 클래스 멤버 유형에 대해 ClassMember
레벨로 정의하면 중복 된 코드를 많이 작성해야합니다. 예를 들어,
instance Formattable ClassMember where
format (CmTypedef td) = format td
format (CmMethod m) = format m
format (CmOperatorOverload oo) = format oo
format (CmVariable v) = format v
format (CmFriendClass fc) = format fc
format (CmDestructor d) = format d
instance Prettifyable ClassMember where
-- same story here
, 나는 확실히 때문에하지 않는 것
data ClassMember a = ClassMember a
instance Formattable ClassMember a
format (ClassMember a) = format a
로 정의 (적어도 난 그렇게 생각) ClassMember
개체의 목록을 가지고 싶습니다 옵션이 될 수 있습니다. 인스턴스 자체를 반대하지 ClassMember
에
스토어,하지만 기능은 형식 루틴에 필요한 해당 유형에 정의 : 내가 고려하고
대안입니다. 이 방법은 구문 분석 결과에 따라
[ClassMember]
으로 표시되는 모듈성을 손상시킵니다. IMO는 모든 용도를 알고 있어야합니다.ClassMember
을 실재 유형으로 정의하십시오. 따라서[ClassMember]
은 더 이상 문제가되지 않습니다. 이 디자인이 충분히 엄격한 지 의심스럽고 다시 정의하면 정의에 모든 제약 조건을 지정해야합니다 (예 :data ClassMember = forall a . Formattable a => ClassMember a
). 또한 확장을 사용하지 않고 솔루션을 선호합니다.
내가 하스켈에서 적절한 방법을 사용하고 있습니까? 아니면 더 좋은 방법이 있습니까?
왜 먼저 Formattable 클래스와 Prettifyable 클래스가 필요합니까? 'ClassMember'가 아닌 무언가를'포맷팅 '할 것인가? –
@BenjaminHodgson : 예, 이것이 문제입니다. 실제 포맷은'data FormattableItem = FiClassMember ClassMember (아마 SingleLineComment)입니다. FiSingleLineComment SingleLineComment | FiComment Comment | FiScopeModifier AccessModifier'를 호출합니다. 형식 지정 규칙은 약간 멋지다 :'ClassMember' 오브젝트는 다른 'FormattableItem' 오브젝트에 의해 그룹으로 분할되고 그룹 내에서 또한 서로 의존합니다. – AdelNick