Copyright | (c) 2009--2010 Universiteit Utrecht |
---|---|
License | BSD3 |
Maintainer | generics@haskell.org |
Stability | experimental |
Portability | non-portable |
Safe Haskell | Safe |
Language | Haskell2010 |
A variant of fold that allows the specification of the algebra in a convenient way, and that fixes the result type to a constant.
The type family of convenient algebras.
type family Alg f r :: * Source
The type family we use to describe the convenient algebras.
type Alg U r = r Source | For a unit, no arguments are available. |
type Alg (K a) r = a -> r Source | For a constant, we take the constant value to a result. |
type Alg (I xi) r = r -> r Source | For an identity, we turn the recursive result into a final result. Note that the index can change. |
type Alg (C c f) r = Alg f r Source | Constructors are ignored. |
type Alg ((:>:) f xi) r = Alg f r Source | Tags are ignored. |
type Alg ((:*:) (K a) g) r = a -> Alg g r Source | For a product where the left hand side is a constant, we take the value as an additional argument. |
type Alg ((:*:) (I xi) g) r = r -> Alg g r Source | For a product where the left hand side is an identity, we take the recursive result as an additional argument. |
type Alg ((:+:) f g) r = (Alg f r, Alg g r) Source | For a sum, the algebra is a pair of two algebras. |
type Algebra phi r = forall ix. phi ix -> Alg (PF phi) r Source
The algebras passed to the fold have to work for all index types in the family. The additional witness argument is required only to make GHC's typechecker happy.
The class to turn convenient algebras into standard algebras.
The class fold explains how to convert a convenient algebra
Alg
back into a function from functor to result, as required
by the standard fold function.
Interface
fold :: forall phi ix r. (Fam phi, HFunctor phi (PF phi), Fold (PF phi)) => Algebra phi r -> phi ix -> ix -> r Source
Fold with convenient algebras.