multirec-0.7.8: Generic programming for families of recursive datatypes

Copyright (c) 2009--2010 Universiteit Utrecht BSD3 generics@haskell.org experimental non-portable Safe Haskell2010

Generics.MultiRec.FoldAlgK

Description

A variant of fold that allows the specification of the algebra in a convenient way, and that fixes the result type to a constant.

Synopsis

# 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 # type Alg U r = r type Alg (K a) r Source # type Alg (K a) r = a -> r type Alg (I xi) r Source # type Alg (I xi) r = r -> r type Alg (C c f) r Source # type Alg (C c f) r = Alg f r type Alg ((:>:) f xi) r Source # type Alg ((:>:) f xi) r = Alg f r type Alg ((:*:) (K a) g) r Source # type Alg ((:*:) (K a) g) r = a -> Alg g r type Alg ((:*:) (I xi) g) r Source # type Alg ((:*:) (I xi) g) r = r -> Alg g r type Alg ((:+:) f g) r Source # type Alg ((:+:) f g) r = (Alg f r, Alg g r)

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.

Minimal complete definition

alg

Methods

alg :: Alg f r -> f (K0 r) ix -> r Source #

Instances

 Source # Methodsalg :: Alg U r -> U (K0 r) ix -> r Source # Fold (K a) Source # Methodsalg :: Alg (K a) r -> K a (K0 r) ix -> r Source # Fold (I xi) Source # Methodsalg :: Alg (I xi) r -> I xi (K0 r) ix -> r Source # Fold f => Fold (C c f) Source # Methodsalg :: Alg (C c f) r -> C c f (K0 r) ix -> r Source # Fold f => Fold ((:>:) f xi) Source # Methodsalg :: Alg (f :>: xi) r -> (f :>: xi) (K0 r) ix -> r Source # Fold g => Fold ((:*:) (K a) g) Source # Methodsalg :: Alg (K a :*: g) r -> (K a :*: g) (K0 r) ix -> r Source # Fold g => Fold ((:*:) (I xi) g) Source # Methodsalg :: Alg (I xi :*: g) r -> (I xi :*: g) (K0 r) ix -> r Source # (Fold f, Fold g) => Fold ((:+:) f g) Source # Methodsalg :: Alg (f :+: g) r -> (f :+: g) (K0 r) ix -> r Source #

# 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.

# Construction of algebras

(&) :: a -> b -> (a, b) infixr 5 Source #

For constructing algebras that are made of nested pairs rather than n-ary tuples, it is helpful to use this pairing combinator.