Generic programming (GP) is a form of abstraction in programming languages that
serves to reduce code duplication by exploiting the regular structure of
algebraic datatypes. Several different approaches to GP in Haskell have
surfaced, giving rise to the problem of code duplication across GP libraries.
Given the original goals of GP, this is a rather unfortunate turn of events.
Fortunately, we can convert between the different representations of each
approach, which allows us to ``borrow'' generic functions from different
approaches, avoiding the need to reimplement every generic function in every
single GP library.

In previous work we have shown how existing GP libraries relate to each other.
In this paper we go one step further and advocate “hierarchical GP”:
through proper design of different GP approaches, each library can fit neatly in
a hierarchy, greatly minimizing the amount of supporting infrastructure
necessary for each approach, and allowing each library to be specific and
concise, while eliminating code duplication overall.
We introduce a new library for GP in Haskell intended to sit at the top of the
“GP hierarchy”. This library contains a lot of structural information, and is
not intended to be used directly. Instead, it is a good starting point for
generating generic representations for other libraries. This approach is also
suitable for being the only library with native compiler support; all other
approaches can be obtained from this one by simple conversion of representations
in plain Haskell code.