Question

I have made an interdependent tree of datatypes as below. PT being the 'root'-datatype. There are functions that should combine the lower datatypes to the root. This way, Giving these functions the type signature (a -> b -> ... -> PT), requires me to include a lot of information to get to lower datatypes (PTCmd CmdSub Hp ...). This descent down the datatype tree is irrelevant and i wouldn't like to include this information in the result.

If I define all the lower datatypes in PT itself, the datatype definition harder to read.

Besides adding worthless information to the result, and a single huge datatype definition, is there another, preferably less of an eyesore, way to have my functions result in the root datatype PT?

data PT = PTCmd Command | PTVal V | PTCon C
  deriving (Eq, Show)

data Command = CmdSub Sub | ...
  deriving (Eq, Show)

data SubCommand = Hp V C | ...
  deriving (Eq, Show)

No correct solution

OTHER TIPS

Perhaps you could define some "smart constructors"; for example:

cmdSub = PTCmd . CmdSub
hp = cmdSub . Hp

If you can afford using GHC 7.8 then you should look at the PatternSynonyms extension, as it addresses your issues quite well.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top