Simon,
Thanks a lot for looking into this. One question regarding maps that I still don't understand: can you explain me if it is indeed to be expected that GHC won't fuse `map f . map g` into `map (f . g)` by default? Also, same for `map f [x]` ~> `[f x]`?
Regarding your reply:
You wondered why it made a difference whether you said
or
instance GEnum Nat where
genum = map to genum'
instance GEnum Nat -- Fill in from default method
Well, it turns out that the difference is largely accidental.