multirec-0.7.8: 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 #