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 classmembers – well, shouldn't have defined c in first place! purpose of type classes express mathematical concepts hold great variety of types.

haskell design

Comments

Popular posts from this blog

xslt - DocBook 5 to PDF transform failing with error: "fo:flow" is missing child elements. Required content model: marker* -

mediawiki - How do I insert tables inside infoboxes on Wikia pages? -

Local Service User Logged into Windows -