Generic programming allows you to write a function once, and use it many times at different types. A lot of good foundational work on generic programming has been done. The goal of this paper is to propose a practical way of supporting generic programming within the Haskell language, while going "with the grain" of the language.
On the way, we came across a separate issue, concerning type-class overloading where higher kinds are involved. We propose a simple type-system extension to allow the programmer to write richer contexts than is currently possible.