Generic Haskell is an extension of Haskell that supports the construction of generic programs. These lecture notes discuss
three advanced generic programming applications: generic dictionaries, compressing XML documents, and the zipper: a data structure
used to represent a tree together with a subtree that is the focus of attention, where that focus may move left, right, up
or down the tree. When describing and implementing these examples, we will encounter some advanced features of Generic Haskell,
such as type-indexed data types, dependencies between and generic abstractions of generic functions, adjusting a generic function
using a default case, and generic functions with a special case for a particular constructor.