enum generates a list of the values of a datatypes. It will produce all
values of all supported datatypes (with only a few exceptions [1]). For
datatypes that have an infinite enumeration (e.g. Integer and [a]),
enum produces an infinite list.

A number of the techniques used to write enum came from a talk by Mark
Jones at the 2008 Advanced Functional Programming Summer School. The authors
gratefully acknowledge his contribution.

1

The exceptions are Float and Double. These are treated in the same way
as their Enum instances are treated. The result looks like this:
[0.0,-1.0,1.0,-2.0,..], thus skipping all non-integral values. Note that
these may overflow, because they are unbounded.