The emgm package
EMGM is a general-purpose library for generic programming with type classes.
The design is based on the idea of modeling algebraic datatypes as sum-of-product structures. Many datatypes can be modeled this way, and, because they all share a common structure, we can write generic functions that work on this structure.
The library provides three main components:
Common - A common foundation for building generic functions and adding support for datatypes. This includes the collection of datatypes (e.g. sum, product, unit) and type classes (e.g. Generic, Rep), that are used throughout the library. This is what you need to define your own generic functions, to add generic support for your datatype, or to define ad-hoc cases.
Functions - A collection of useful generic functions. These work with a variety of datatypes and provide a wide range of operations. For example, there is crush, a generalization of the fold functions. It is one of the most useful functions, because it allows you to flexibly extract the elements of a polymorphic container.
Data - Support for using standard datatypes generically. Types such as [a], tuples, and Maybe are built into Haskell or come included in the standard libraries. EMGM provides full support for generic functions on these datatypes. The modules in this component are also useful as guides when adding generic support for your own datatypes.
EMGM originated in the research of Ralf Hinze, Bruno Oliveira, and Andres Löh [1,2]. The library was further explored in a comparison of generic programming libraries by Alexey Rodriguez, et al . Lastly, this released package was developed simultaneously with the writing of lecture notes for the 2008 Advanced Functional Programming Summer School  (forthcoming). These are good resources for learning how the library works and how to use it, but be aware that names may have been changed to protect the innocent.
Ralf Hinze. Generics for the Masses. In ICFP 2004: Proceedings of the 9th ACM SIGPLAN international conference on Functional programming, pages 236-243. ACM Press, 2004. (http://www.informatik.uni-bonn.de/~ralf/publications.html#P21)
Bruno C. d. S. Oliveira, Ralf Hinze, and Andres Löh. Extensible and Modular Generics for the Masses. In Henrik Nilsson, editor, Trends in Functional Programming, pages 199-216, 2006. (http://web.comlab.ox.ac.uk/publications/publication444-abstract.html)
Alexey Rodriguez, Johan Jeuring, Patrik Jansson, Alex Gerdes, Oleg Kiselyov, and Bruno C. d. S. Oliveira. Comparing Libraries for Generic Programming in Haskell. Technical Report UU-CS-2008-010. Department of Information and Computing Sciences, Utrecht University. (http://www.cs.uu.nl/wiki/bin/view/Alexey/ComparingLibrariesForGenericProgrammingInHaskell)
Johan Jeuring, Sean Leather, José Pedro Magalhães, and Alexey Rodriguez Yakushev. Libraries for Generic Programming in Haskell. Technical Report UU-CS-2008-025. Department of Information and Computing Sciences, Utrecht University. (http://www.cs.uu.nl/research/techreps/UU-CS-2008-025.html)
|Versions||0.1, 0.2, 0.3, 0.3.1, 0.4|
|Change log||None available|
|Dependencies||base (>=3.0), HUnit (>=1.2), QuickCheck (>=2.0)|
|Copyright||(c) 2008 Universiteit Utrecht|
|Author||Sean Leather, José Pedro Magalhães, Alexey Rodriguez, Andres Löh|
|Uploaded||Fri Sep 19 15:33:03 UTC 2008 by SeanLeather|
|Downloads||708 total (29 in last 30 days)|
|Status||Docs uploaded by user|
Build status unknown [no reports yet]
|test||Enable the test configuration: Build the test executable, reduce build time.||Disabled|
|hpc||Enable program coverage on test executable.||Disabled|
|nolib||Don't build the library. This is useful for speeding up the modify-build-test loop. With "-ftest" (only), the build command will build both the library and the test executable. With "-ftest -fnolib", the build command builds only the test executable.||Disabled|
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
For package maintainers and hackage trustees