multirec-0.7.7: Generic programming for families of recursive datatypes

Copyright(c) 2008--2010 Universiteit Utrecht
LicenseBSD3
Maintainergenerics@haskell.org
Stabilityexperimental
Portabilitynon-portable
Safe HaskellSafe
LanguageHaskell2010

Generics.MultiRec.Fold

Contents

Description

The definition of generic fold, unfold, paramorphisms. In addition, some combinators that facilitate the construction of algebras.

There are several variants of fold in other modules that are probably easier to use:

Synopsis

Generic fold and unfold

type Algebra' phi f r = forall ix. phi ix -> f r ix -> r ix Source

type Algebra phi r = Algebra' phi (PF phi) r Source

type AlgebraF' phi f g r = forall ix. phi ix -> f r ix -> g (r ix) Source

type AlgebraF phi g r = AlgebraF' phi (PF phi) g r Source

fold :: (Fam phi, HFunctor phi (PF phi)) => Algebra phi r -> phi ix -> ix -> r ix Source

foldM :: (Fam phi, HFunctor phi (PF phi), Monad m) => AlgebraF phi m r -> phi ix -> ix -> m (r ix) Source

type CoAlgebra' phi f r = forall ix. phi ix -> r ix -> f r ix Source

type CoAlgebra phi r = CoAlgebra' phi (PF phi) r Source

type CoAlgebraF' phi f g r = forall ix. phi ix -> r ix -> g (f r ix) Source

type CoAlgebraF phi g r = CoAlgebraF' phi (PF phi) g r Source

unfold :: (Fam phi, HFunctor phi (PF phi)) => CoAlgebra phi r -> phi ix -> r ix -> ix Source

unfoldM :: (Fam phi, HFunctor phi (PF phi), Monad m) => CoAlgebraF phi m r -> phi ix -> r ix -> m ix Source

type ParaAlgebra' phi f r = forall ix. phi ix -> f r ix -> ix -> r ix Source

type ParaAlgebra phi r = ParaAlgebra' phi (PF phi) r Source

type ParaAlgebraF' phi f g r = forall ix. phi ix -> f r ix -> ix -> g (r ix) Source

type ParaAlgebraF phi g r = ParaAlgebraF' phi (PF phi) g r Source

para :: (Fam phi, HFunctor phi (PF phi)) => ParaAlgebra phi r -> phi ix -> ix -> r ix Source

paraM :: (Fam phi, HFunctor phi (PF phi), Monad m) => ParaAlgebraF phi m r -> phi ix -> ix -> m (r ix) Source

Creating an algebra

type AlgPart f r ix = f r ix -> r ix Source

type (:->) f g r ix = f r ix -> g r ix infixr 9 Source

(&) :: (AlgPart a :-> (AlgPart b :-> AlgPart (a :+: b))) r ix infixr 5 Source

tag :: AlgPart a r ix -> AlgPart (a :>: ix) r ix' Source

con :: AlgPart a r ix -> AlgPart (C c a) r ix Source