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.

## Instances

type Alg U r Source # | For a unit, no arguments are available. |

Defined in Generics.MultiRec.FoldAlgK | |

type Alg (K a) r Source # | For a constant, we take the constant value to a result. |

Defined in Generics.MultiRec.FoldAlgK | |

type Alg (I xi) r Source # | For an identity, we turn the recursive result into a final result. Note that the index can change. |

Defined in Generics.MultiRec.FoldAlgK | |

type Alg (C c f) r Source # | Constructors are ignored. |

Defined in Generics.MultiRec.FoldAlgK | |

type Alg (f :>: xi) r Source # | Tags are ignored. |

Defined in Generics.MultiRec.FoldAlgK | |

type Alg (K a :*: g) r Source # | For a product where the left hand side is a constant, we take the value as an additional argument. |

Defined in Generics.MultiRec.FoldAlgK | |

type Alg (I xi :*: g) r Source # | For a product where the left hand side is an identity, we take the recursive result as an additional argument. |

Defined in Generics.MultiRec.FoldAlgK | |

type Alg (f :+: g) r Source # | For a sum, the algebra is a pair of two algebras. |

Defined in Generics.MultiRec.FoldAlgK |

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.

class Fold (f :: (* -> *) -> * -> *) where Source #

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.