
Bas van Dijk wrote:
....
I would also like to get the formatting constraints working. However the solution in the code below gives a "Duplicate instance declarations" error. If I -fallow-overlapping-instances than the type checker goes into an infinite loop.
I would like to know why this is happening and if there's a way to fix it.
You have multiple instances with the same instance head (the part after the =>). Haskell doesn't look at the context when deciding what instance to use, so they overlap. An alternative idea would be to use data types instead of classes for the registers and memory locations
data Reg size tag = Reg data EAX_ -- dummy type, not exported -- only export this type EAX = Reg Bit32 EAX_ eax :: EAX eax = Reg
and similairly for memory
data Mem size tag = Mem Word32 data Mem32_ -- dummy type, not exported type Mem32 = Mem Bit32 Mem32_
Now you can have the instances
instance MovFormat (Reg size a) (Reg size b) instance MovFormat (Reg size a) (Mem size b)
etc. Twan