Hi Maarten,


On Tue, Dec 10, 2013 at 3:48 PM, Maarten Faddegon <haskell-cafe@maartenfaddegon.nl> wrote:
Dear list,


-- | Meta-information (constructor names, etc.)
instance (GToonbaar a, Constructor c) => GToonbaar (M1 i c a) where

This is not good; an instance of |Constructor c| will only be available when your |M1 i c a| is
actually |M1 C c a| (so |i ~ C|). In the other cases (that is, when |i| is either |D| or |S|), that
instance will not exist (there will be |Datatype| and |Selector| instances, respectively).

You can find a generic show using GHC.Generics here:
http://hackage.haskell.org/package/generic-deriving-1.6.2/docs/src/Generics-Deriving-Show.html
 

-- | Sums: encode choice between constructors
instance (GToonbaar a, GToonbaar b) => GToonbaar (a :+: b) where
        gtoon x = gtoon x

This will cause your code to loop, btw.
 

When I try to compile the above, ghc emits the following error:

    No instance for (Constructor Main.D1MyData)
      arising from a use of `Main.$gdmtoon'
    Possible fix:
      add an instance declaration for (Constructor Main.D1MyData)
    In the expression: (Main.$gdmtoon)
    In an equation for `toon': toon = (Main.$gdmtoon)
    In the instance declaration for `Toonbaar MyData'

It's not the most beautiful of errors, but it does say that there is no |Constructor|
instance for |D1MyData|, and |D1MyData| is the automatically generated datatype
to encode the *datatype* meta-information for |MyData|.


Hope that helps,
Pedro