These ideas are also close to the "Scrap Your Boilerplate" approach (Data.Typeable & Data.Data typeclasses). ie, a generic pretty-printer can be derived from any type, not only those having a user-defined Show instance.
http://research.microsoft.com/en-us/um/people/simonpj/papers...