`feat`

is a library that offers support for counting, enumerating, and sampling objects of a certain kind, such as (say) the inhabitants of an algebraic data type.

Feat was inspired by the paper Feat: Functional Enumeration of Algebraic Types by Jonas Duregård, Patrik Jansson and Meng Wang (2012). It can perhaps be compared with the Haskell library testing-feat, although a detailed comparison has not been carried out.

The packages `feat`

and `feat-num`

offer the same API: you should use either `feat`

or `feat-num`

, not both. `feat`

relies on the big integer library zarith, whereas `feat-num`

relies on the legacy library num. Both packages offer the same API: the main module, named `Feat`

or `FeatNum`

, offers three submodules named `Num`

, `IFSeq`

, and `Enum`

.

`Feat.Num`

This module implements a small set of operations on big integers.`Feat.IFSeq`

This module provides an abstract data type of**implicit, finite sequences**. An implicit sequence is not explicitly represented in memory as an actual sequence of elements: instead, it is*described*by a data structure which contains enough information to produce an arbitrary element upon request. This design decision imposes some constraints on the operations that can be efficiently supported: for instance,`filter`

is not supported.`Feat.Enum`

This module offers a concrete data type`'a enum`

of**enumerations**of elements of type`'a`

. Suppose that every element of type`'a`

is implicitly assigned a certain size. Then, an enumeration is a function of an integer`s`

to the (implicit, finite) sequence of all elements whose size is`s`

.