Generic Haskell, a language for generic programming