Generic programming adds a new dimension to the parametrisation of programs by allowing programs to be dependent on the structure
of the data that they manipulate. Apart from the practical advantages of improved productivity that this offers, a major potential
advantage is a substantial reduction in the burden of proof – by making programs more general we can also make them more robust
and more reliable. These lectures discuss a theory of datatypes based on the algebra of relations which forms a basis for
understanding datatype-generic programs. We review the notion of parametric polymorphism much exploited in conventional functional
programming languages and show how it is extended to the higher-order notions of polymorphism relevant to generic programming.