Data type design in Haskell -
Data type design in Haskell -
learning haskell, write formatter of c++ header files. first, parse class members a-collection-of-class-members passed formatting routine. represent class members have
data classmember = cmtypedef typedef | cmmethod method | cmoperatoroverload operatoroverload | cmvariable variable | cmfriendclass friendclass | cmdestructor destructor
(i need classify class members way because of peculiarities of formatting style.)
the problem annoys me "drag" function defined class fellow member types classmember
level, have write lot of redundant code. example,
instance formattable classmember 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 -- same story here
on other hand, have list of classmember
objects (at least, think so), hence defining
data classmember = classmember instance formattable classmember format (classmember a) = format
doesn't seem option.
the alternatives i'm considering are:
store in classmember
not object instances themselves, functions defined on corresponding types, needed formatting routine. approach breaks modularity, imo, parsing results, represented [classmember]
, need aware of usages.
define classmember
existential type, [classmember]
no longer problem. uncertainty whether design strict plenty and, again, need specify constraints in definition, data classmember = forall . formattable => classmember a
. also, prefer solution without using extensions.
is i'm doing proper way in haskell or there improve way?
first, consider trimming downwards adt bit. operator overloads , destructors special kinds of methods, might create more sense treat 3 in cmmethod
; method
have special ways separate them. alternatively, maintain 3 cmmethod
, cmoperatoroverload
, , cmdestructor
, allow them contain same method
type.
but of course, can cut down complexity much.
as specific illustration of show
instance: don't want write except in special cases. case, it's much more reasonable have instance derived automatically:
data classmember = cmtypedef typedef | cmmethod method | ... | cmdestructor destructor deriving (show)
this give different results custom instance – because yours wrong: showing contained result should give info constructor.
if you're not interested in show
talking class c
more specific classmember
s – well, shouldn't have defined c
in first place! purpose of type classes express mathematical concepts hold great variety of types.
haskell design
Comments
Post a Comment