compdata-0.11: Compositional Data Types

Copyright(c) 2010-2011 Patrick Bahr Tom Hvitved
LicenseBSD3
MaintainerPatrick Bahr <paba@diku.dk>
Stabilityexperimental
Portabilitynon-portable (GHC Extensions)
Safe HaskellNone
LanguageHaskell98

Data.Comp.Sum

Contents

Description

This module provides the infrastructure to extend signatures.

Synopsis

Documentation

type (:<:) f g = Subsume (ComprEmb (Elem f g)) f g infixl 5 Source #

A constraint f :<: g expresses that the signature f is subsumed by g, i.e. f can be used to construct elements in g.

type (:=:) f g = (f :<: g, g :<: f) infixl 5 Source #

data (f :+: g) e infixr 6 Source #

Formal sum of signatures (functors).

Instances

DistAnn k s p s' => DistAnn k ((:+:) k f s) p ((:+:) k ((:&:) k f p) s') Source # 

Methods

injectA :: (k :+: (k :&: f) p) s' -> p a -> s' a Source #

projectA :: s' a -> (p a, (k :+: (k :&: f) p) s') Source #

RemA k s s' => RemA k ((:+:) k ((:&:) k f p) s) ((:+:) k f s') Source # 

Methods

remA :: (k :+: f) s' a -> s' a Source #

(Functor f, Functor g) => Functor ((:+:) * f g) Source # 

Methods

fmap :: (a -> b) -> (* :+: f) g a -> (* :+: f) g b #

(<$) :: a -> (* :+: f) g b -> (* :+: f) g a #

(Foldable f, Foldable g) => Foldable ((:+:) * f g) Source # 

Methods

fold :: Monoid m => (* :+: f) g m -> m #

foldMap :: Monoid m => (a -> m) -> (* :+: f) g a -> m #

foldr :: (a -> b -> b) -> b -> (* :+: f) g a -> b #

foldr' :: (a -> b -> b) -> b -> (* :+: f) g a -> b #

foldl :: (b -> a -> b) -> b -> (* :+: f) g a -> b #

foldl' :: (b -> a -> b) -> b -> (* :+: f) g a -> b #

foldr1 :: (a -> a -> a) -> (* :+: f) g a -> a #

foldl1 :: (a -> a -> a) -> (* :+: f) g a -> a #

toList :: (* :+: f) g a -> [a] #

null :: (* :+: f) g a -> Bool #

length :: (* :+: f) g a -> Int #

elem :: Eq a => a -> (* :+: f) g a -> Bool #

maximum :: Ord a => (* :+: f) g a -> a #

minimum :: Ord a => (* :+: f) g a -> a #

sum :: Num a => (* :+: f) g a -> a #

product :: Num a => (* :+: f) g a -> a #

(Traversable f, Traversable g) => Traversable ((:+:) * f g) Source # 

Methods

traverse :: Applicative f => (a -> f b) -> (* :+: f) g a -> f ((* :+: f) g b) #

sequenceA :: Applicative f => (* :+: f) g (f a) -> f ((* :+: f) g a) #

mapM :: Monad m => (a -> m b) -> (* :+: f) g a -> m ((* :+: f) g b) #

sequence :: Monad m => (* :+: f) g (m a) -> m ((* :+: f) g a) #

(Render f, Render g) => Render ((:+:) * f g) Source # 

Methods

stringTreeAlg :: Alg ((* :+: f) g) (Tree String) Source #

(HasVars f v0, HasVars g v0) => HasVars ((:+:) * f g) v0 Source # 

Methods

isVar :: (* :+: f) g a -> Maybe v0 Source #

bindsVars :: Mapping m a => (* :+: f) g a -> m (Set v0) Source #

(Desugar f h, Desugar g h) => Desugar ((:+:) * f g) h Source # 

Methods

desugHom :: Hom ((* :+: f) g) h Source #

desugHom' :: Alg ((* :+: f) g) (Context h a) Source #

caseF :: (f a -> b) -> (g a -> b) -> (f :+: g) a -> b Source #

Utility function to case on a functor sum, without exposing the internal representation of sums.

Projections for Signatures and Terms

proj :: forall f g a. f :<: g => g a -> Maybe (f a) Source #

project :: g :<: f => Cxt h f a -> Maybe (g (Cxt h f a)) Source #

Project the outermost layer of a term to a sub signature. If the signature g is compound of n atomic signatures, use projectn instead.

deepProject :: (Traversable g, g :<: f) => CxtFunM Maybe f g Source #

Tries to coerce a termcontext to a termcontext over a sub-signature. If the signature g is compound of n atomic signatures, use deepProjectn instead.

project_ :: SigFunM Maybe f g -> Cxt h f a -> Maybe (g (Cxt h f a)) Source #

Project the outermost layer of a term to a sub signature. If the signature g is compound of n atomic signatures, use projectn instead.

deepProject_ :: Traversable g => SigFunM Maybe f g -> CxtFunM Maybe f g Source #

Tries to coerce a termcontext to a termcontext over a sub-signature. If the signature g is compound of n atomic signatures, use deepProjectn instead.

Injections for Signatures and Terms

inj :: forall f g a. f :<: g => f a -> g a Source #

inject :: g :<: f => g (Cxt h f a) -> Cxt h f a Source #

Inject a term where the outermost layer is a sub signature. If the signature g is compound of n atomic signatures, use injectn instead.

deepInject :: (Functor g, g :<: f) => CxtFun g f Source #

Inject a term over a sub signature to a term over larger signature. If the signature g is compound of n atomic signatures, use deepInjectn instead.

inject_ :: SigFun g f -> g (Cxt h f a) -> Cxt h f a Source #

Inject a term where the outermost layer is a sub signature. If the signature g is compound of n atomic signatures, use injectn instead.

deepInject_ :: Functor g => SigFun g f -> CxtFun g f Source #

Inject a term over a sub signature to a term over larger signature. If the signature g is compound of n atomic signatures, use deepInjectn instead.

split :: f :=: (f1 :+: f2) => (f1 (Term f) -> a) -> (f2 (Term f) -> a) -> Term f -> a Source #

Injections and Projections for Constants

injectConst :: (Functor g, g :<: f) => Const g -> Cxt h f a Source #

projectConst :: (Functor g, g :<: f) => Cxt h f a -> Maybe (Const g) Source #

injectCxt :: (Functor g, g :<: f) => Cxt h' g (Cxt h f a) -> Cxt h f a Source #

This function injects a whole context into another context.

liftCxt :: (Functor f, g :<: f) => g a -> Context f a Source #

This function lifts the given functor to a context.

substHoles :: (Functor f, Functor g, f :<: g) => Cxt h' f v -> (v -> Cxt h g a) -> Cxt h g a Source #

This function applies the given context with hole type a to a family f of contexts (possibly terms) indexed by a. That is, each hole h is replaced by the context f h.

substHoles' :: (Functor f, Functor g, f :<: g, Ord v) => Cxt h' f v -> Map v (Cxt h g a) -> Cxt h g a Source #

Orphan instances

(Eq (f a), Eq (g a)) => Eq ((:+:) * f g a) Source # 

Methods

(==) :: (* :+: f) g a -> (* :+: f) g a -> Bool #

(/=) :: (* :+: f) g a -> (* :+: f) g a -> Bool #

(Ord (f a), Ord (g a)) => Ord ((:+:) * f g a) Source # 

Methods

compare :: (* :+: f) g a -> (* :+: f) g a -> Ordering #

(<) :: (* :+: f) g a -> (* :+: f) g a -> Bool #

(<=) :: (* :+: f) g a -> (* :+: f) g a -> Bool #

(>) :: (* :+: f) g a -> (* :+: f) g a -> Bool #

(>=) :: (* :+: f) g a -> (* :+: f) g a -> Bool #

max :: (* :+: f) g a -> (* :+: f) g a -> (* :+: f) g a #

min :: (* :+: f) g a -> (* :+: f) g a -> (* :+: f) g a #

(Show (f a), Show (g a)) => Show ((:+:) * f g a) Source # 

Methods

showsPrec :: Int -> (* :+: f) g a -> ShowS #

show :: (* :+: f) g a -> String #

showList :: [(* :+: f) g a] -> ShowS #