Software development often consists of designing datatypes around which functionality is
added. Some functionality is datatype specific, whereas other functionality is defined on
almost all datatypes in such a way that it depends only on the structure of the datatype.
A function that works on many datatypes in this way is called a generic (or polytypic)
function. Examples of generic functionality include storing a value in a database, editing
a value, comparing two values for equality, and pretty-printing a value.
Since datatypes often change and new datatypes are introduced, we have developed
Generic HASKELL which supports generic definitions to save the programmer from
(re)writing instances of generic functions. Generic HASKELL extends the functional
programming language Haskell [5] with, among other things, a construct for defining
type-indexed values with kind-indexed types, based on recent work by Hinze [2]. These
values can be specialised to all Haskell datatypes, facilitating wider application of generic
programming than provided by earlier systems such as PolyP [4]