free-algebras-0.0.1.0

Safe HaskellSafe
LanguageHaskell2010

Data.Algebra.Free

Contents

Synopsis

Algebra type

type family AlgebraType (f :: k) (a :: l) :: Constraint Source #

Type family which for each free algebra m returns a type level lambda from types to constraints. It is describe the class of algebras for which this free algebra is free.

A lawful instance for this type family must guarantee that the constraint AlgebraType0 m f is implied by the AlgebraType m f constraint. This guaranees that there exists a forgetful functor from the category of types of kind * -> * which satisfy AlgebraType m constrain to the category of types of kind * -> * which satisfy the 'AlgebraType0 m constraint.

Instances
type AlgebraType [] (m :: *) Source # 
Instance details

Defined in Data.Algebra.Free

type AlgebraType [] (m :: *) = Monoid m
type AlgebraType Maybe (m :: *) Source # 
Instance details

Defined in Data.Algebra.Free

type AlgebraType Maybe (m :: *) = Pointed m
type AlgebraType NonEmpty (m :: *) Source # 
Instance details

Defined in Data.Algebra.Free

type AlgebraType FreeGroup (g :: *) Source # 
Instance details

Defined in Data.Group.Free

type AlgebraType FreeGroup (g :: *) = Group g
type AlgebraType FreeAbelianSemigroup (a :: *) Source # 
Instance details

Defined in Data.Semigroup.Abelian

type AlgebraType FreeAbelianMonoid (m :: *) Source # 
Instance details

Defined in Data.Monoid.Abelian

type AlgebraType FreeSemiLattice (a :: *) Source # 
Instance details

Defined in Data.Semigroup.SemiLattice

type AlgebraType (FreeMSet m :: * -> *) (a :: *) Source # 
Instance details

Defined in Data.Monoid.MSet

type AlgebraType (FreeMSet m :: * -> *) (a :: *) = MSet m a
type AlgebraType F (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType F (m :: * -> *) = Monad m
type AlgebraType Free (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType Free (m :: * -> *) = Monad m
type AlgebraType Ap (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType Ap (g :: * -> *) = Applicative g
type AlgebraType Ap (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType Ap (g :: * -> *) = Applicative g
type AlgebraType Ap (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType Ap (g :: * -> *) = Applicative g
type AlgebraType Alt (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType Alt (m :: * -> *) = Alternative m
type AlgebraType Coyoneda (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType Coyoneda (g :: * -> *) = Functor g
type AlgebraType ListT (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType ListT (m :: * -> *) = MonadList m
type AlgebraType MaybeT (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType MaybeT (m :: * -> *) = (Monad m, MonadMaybe m)
type AlgebraType DayF (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType DayF (g :: * -> *) = Applicative g
type AlgebraType (ExceptT e :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (ExceptT e :: (* -> *) -> * -> *) (m :: * -> *) = MonadError e m
type AlgebraType (StateT s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (StateT s :: (* -> *) -> * -> *) (m :: * -> *) = MonadState s m
type AlgebraType (StateT s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (StateT s :: (* -> *) -> * -> *) (m :: * -> *) = MonadState s m
type AlgebraType (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) = MonadWriter w m
type AlgebraType (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) = MonadWriter w m
type AlgebraType (ReaderT r :: (k -> *) -> k -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (ReaderT r :: (k -> *) -> k -> *) (m :: * -> *) = MonadReader r m
type AlgebraType (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) = MonadRWS r w s m
type AlgebraType (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) = MonadRWS r w s m
type AlgebraType (FreeMAction m :: (k -> *) -> k -> *) (f :: * -> *) Source # 
Instance details

Defined in Control.Monad.Action

type AlgebraType (FreeMAction m :: (k -> *) -> k -> *) (f :: * -> *) = MAction m f

type family AlgebraType0 (f :: k) (a :: l) :: Constraint Source #

Type family which limits Hask to its full subcategory which satisfies a given constraints. Some free algebras, like free groups, or free abelian semigroups have additional constraints on on generators, like Eq or Ord.

Instances
type AlgebraType0 Coyoneda (g :: l) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 Coyoneda (g :: l) = ()
type AlgebraType0 Maybe (a :: l) Source # 
Instance details

Defined in Data.Algebra.Free

type AlgebraType0 Maybe (a :: l) = ()
type AlgebraType0 [] (a :: l) Source # 
Instance details

Defined in Data.Algebra.Free

type AlgebraType0 [] (a :: l) = ()
type AlgebraType0 NonEmpty (a :: l) Source # 
Instance details

Defined in Data.Algebra.Free

type AlgebraType0 NonEmpty (a :: l) = ()
type AlgebraType0 (FreeMSet m :: * -> *) (a :: l) Source # 
Instance details

Defined in Data.Monoid.MSet

type AlgebraType0 (FreeMSet m :: * -> *) (a :: l) = ()
type AlgebraType0 FreeGroup (a :: *) Source # 
Instance details

Defined in Data.Group.Free

type AlgebraType0 FreeGroup (a :: *) = Eq a
type AlgebraType0 FreeAbelianSemigroup (a :: *) Source # 
Instance details

Defined in Data.Semigroup.Abelian

type AlgebraType0 FreeAbelianMonoid (a :: *) Source # 
Instance details

Defined in Data.Monoid.Abelian

type AlgebraType0 FreeSemiLattice (a :: *) Source # 
Instance details

Defined in Data.Semigroup.SemiLattice

type AlgebraType0 F (f :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 F (f :: * -> *) = Functor f
type AlgebraType0 Free (f :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 Free (f :: * -> *) = Functor f
type AlgebraType0 Ap (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 Ap (g :: * -> *) = Functor g
type AlgebraType0 Ap (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 Ap (g :: * -> *) = Functor g
type AlgebraType0 Ap (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 Ap (g :: * -> *) = Functor g
type AlgebraType0 Alt (f :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 Alt (f :: * -> *) = Functor f
type AlgebraType0 ListT (f :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 ListT (f :: * -> *) = Monad f
type AlgebraType0 MaybeT (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 MaybeT (m :: * -> *) = Monad m
type AlgebraType0 DayF (g :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 DayF (g :: * -> *) = Applicative g
type AlgebraType0 (ExceptT e :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (ExceptT e :: (* -> *) -> * -> *) (m :: * -> *) = Monad m
type AlgebraType0 (StateT s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (StateT s :: (* -> *) -> * -> *) (m :: * -> *) = Monad m
type AlgebraType0 (StateT s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (StateT s :: (* -> *) -> * -> *) (m :: * -> *) = Monad m
type AlgebraType0 (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) = (Monad m, Monoid w)
type AlgebraType0 (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (WriterT w :: (* -> *) -> * -> *) (m :: * -> *) = (Monad m, Monoid w)
type AlgebraType0 (ReaderT r :: (k -> *) -> k -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (ReaderT r :: (k -> *) -> k -> *) (m :: * -> *) = Monad m
type AlgebraType0 (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) = (Monad m, Monoid w)
type AlgebraType0 (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) Source # 
Instance details

Defined in Control.Algebra.Free

type AlgebraType0 (RWST r w s :: (* -> *) -> * -> *) (m :: * -> *) = (Monad m, Monoid w)
type AlgebraType0 (FreeMAction m :: (k2 -> k1) -> k2 -> *) (f :: * -> *) Source # 
Instance details

Defined in Control.Monad.Action

type AlgebraType0 (FreeMAction m :: (k2 -> k1) -> k2 -> *) (f :: * -> *) = Functor f

FreeAlgebra class

class FreeAlgebra (m :: Type -> Type) where Source #

A lawful instance has to guarantee that unFoldFree is an inverse of foldMapFree.

This in turn guaranties that m is a left adjoint functor from Hask to algebras of type 'AlgebraType m'. The right adjoint is the forgetful functor. The composition of left adjoin and the right one is always a monad, this is why we will be able to build monad instance for m.

Minimal complete definition

returnFree, foldMapFree, proof

Methods

returnFree :: a -> m a Source #

Injective map that embeds generators a into m.

foldMapFree Source #

Arguments

:: (AlgebraType m d, AlgebraType0 m a) 
=> (a -> d)

map generators of m into d

-> m a -> d

returns a homomorphism from m a to d

The freeness property.

proof :: forall a. AlgebraType0 m a => Proof (AlgebraType m (m a)) m a Source #

Proof that AlgebraType m (m a) holds, e.g. if m ~ [] then [a] is a monoid for all a.

Instances
FreeAlgebra [] Source # 
Instance details

Defined in Data.Algebra.Free

Methods

returnFree :: a -> [a] Source #

foldMapFree :: (AlgebraType [] d, AlgebraType0 [] a) => (a -> d) -> [a] -> d Source #

proof :: AlgebraType0 [] a => Proof (AlgebraType [] [a]) [] a Source #

FreeAlgebra Maybe Source # 
Instance details

Defined in Data.Algebra.Free

FreeAlgebra NonEmpty Source # 
Instance details

Defined in Data.Algebra.Free

FreeAlgebra FreeGroup Source # 
Instance details

Defined in Data.Group.Free

FreeAlgebra FreeAbelianSemigroup Source # 
Instance details

Defined in Data.Semigroup.Abelian

FreeAlgebra FreeAbelianMonoid Source # 
Instance details

Defined in Data.Monoid.Abelian

FreeAlgebra FreeSemiLattice Source # 
Instance details

Defined in Data.Semigroup.SemiLattice

Monoid m => FreeAlgebra (FreeMSet m) Source # 
Instance details

Defined in Data.Monoid.MSet

Methods

returnFree :: a -> FreeMSet m a Source #

foldMapFree :: (AlgebraType (FreeMSet m) d, AlgebraType0 (FreeMSet m) a) => (a -> d) -> FreeMSet m a -> d Source #

proof :: AlgebraType0 (FreeMSet m) a => Proof (AlgebraType (FreeMSet m) (FreeMSet m a)) (FreeMSet m) a Source #

data Proof (c :: Constraint) (f :: k) (a :: l) where Source #

Proof that a is an algebra of type AlgebraType m a.

Constructors

Proof :: c => Proof c f a 

Combinators

unFoldMapFree :: FreeAlgebra m => (m a -> d) -> a -> d Source #

Inverse of foldMapFree

foldFree :: (FreeAlgebra m, AlgebraType0 m a, AlgebraType m a) => m a -> a Source #

All types which satisfy FreeAlgebra constraint are foldable. You can use this map to build a Foldable instance.

foldFree . returnFree == id

natFree :: forall m n a. (AlgebraType m (n a), AlgebraType0 m a, FreeAlgebra m, FreeAlgebra n) => m a -> n a Source #

The canonical quotient map from a free algebra of a wider class to a free algebra of a narrower class, e.g. from a free semigroup to free monoid, or from a free monoid to free commutative monoid, etc.

natFree . natFree == natFree
fmapFree f . natFree == hoistFree . fmapFree f

the constraints: * the algebra n a is of the same type as algebra m (this is always true, just ghc cannot prove it here) * m is a free algebra generated by a * n is a free algebra generated by a

fmapFree :: forall m a b. (FreeAlgebra m, AlgebraType0 m a, AlgebraType0 m b) => (a -> b) -> m a -> m b Source #

All types which satisfy FreeAlgebra constraint are functors. The constraint AlgebraType m (m b) is always satisfied.

joinFree :: forall m a. (FreeAlgebra m, AlgebraType0 m a, AlgebraType0 m (m a)) => m (m a) -> m a Source #

FreeAlgebra constraint implies Monad constrain.

bindFree :: (FreeAlgebra m, AlgebraType0 m a, AlgebraType0 m b, AlgebraType0 m (m b)) => m a -> (a -> m b) -> m b Source #

The monadic bind operator. returnFree is the corresponding return for this monad.

cataFree :: (FreeAlgebra m, AlgebraType0 m a, AlgebraType m a, Functor m) => Fix m -> a Source #

Fix m is the initial algebra in the category of algebras of type AlgebraType m, whenever it exists.

Another way of puting this is observing that Fix m is isomorphic to m Void where m is the free algebra. This isomorphisms is given by fixToFree :: (FreeAlgebra m, AlgebraType m (m Void), Functor m) => Fix m -> m Void fixToFree = cataFree For monoids the inverse is given by ana (_ -> []). The category of semigroups, however, does not have the initial object.