Safe Haskell | None |
---|---|
Language | Haskell2010 |
Builds fold declarations for a fold family.
Documentation
:: [Name] | names of the root datatypes |
-> [Name] | names of the n-ary functor classes to be used |
-> [Name] | names of datatypes declared to be atomic |
-> Q [Dec] |
First discovers the fold family by starting at the root datatypes and including their components' datatypes recursively, then builds declarations from it to be spliced into the source file.
Datatypes declared as atomic will not be recursed into and will not become part of the fold family.
In general, the framework does not currently handle parameterized
types, but applications of Traversable
, Bitraversable
, or
Tritraversable
can be handled, if the user declares them. The
n-ary functors are treated as "transparent" and traversed
through. (You are not expected to understand this explanation: take
a look at the type signatures in the Haddock of the generated
code.)
The framework:
- Generates a parameterized
Fold
record; each parameterxxx
corresponds to a non-atomic datatypeXxx
in the fold family. Each fieldmkYyy
of theFold
corresponds to a constructorYyy
used by some datatype in the fold family. - Generates an
idFold
record; folding overidFold
is equivalent to applyingid
: it does nothing.idFold
is useful as a base record to build your own folds upon. - Generates an
errFold
function to create a taggedFold
record, with undefined fields that give a useful error message when accessed.mkXxx (errFold "example")
is defined aserror "example.mkXxx"
. - Generates a
monadicFold
function that transforms aFold
into one that applies the base fold monadically in a bottom-up, left-to-right way. (Again, see the Haddocks of the generated code.) - For each datatype
Xxx
, generates afoldXxx
function that applies aFold
to anXxx
value, returning a value of typexxx
.
The names Fold
, idFold
, errFold
, and monadicFold
are fixed.
They are intended to be imported qualified.
There are other restrictions not mentioned here: if you hit any of them, the framework should output a helpful, intelligible error message when generating the declarations before trying to splice and compile declarations. You should see no errors from the compiler trying to compile bad generated code.