| Copyright | (c) Eddie Jones 2020 |
|---|---|
| License | BSD-3 |
| Maintainer | eddiejones2108@gmail.com |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Diagram
Contents
Description
This module contains a Free monad with shared subterms.
Unfortunately it is not a true monad in Hask category.
If the classical Free monad generalises a tree, here we generalise directed acylic graphs.
The Diagram is the true monadic context in which all operations are run.
For most operations to work the functor must be of class Eq1, Hashable1 and Traversable.
Synopsis
- data Diagram f a s m r
- runDiagram :: Monad m => (forall s. Diagram f a s m b) -> m b
- compress :: Monad m => Diagram f a s m b -> Diagram f a s Identity (m b)
- data Free (f :: * -> *) a s = Pure a
- free :: (Monad m, Hashable1 f, Hashable a, Eq1 f, Eq a) => f (Free f a s) -> Diagram f a s m (Free f a s)
- fromFree :: Monad m => Free f a s -> (f (Free f a s) -> Diagram f a s m b) -> (a -> Diagram f a s m b) -> Diagram f a s m b
- retract :: (Monad f, Traversable f) => Free f a s -> Diagram f a s f a
- map :: (Hashable1 f, Hashable a, Eq1 f, Eq a, Monad m, Traversable f) => (a -> Diagram f a s m a) -> Free f a s -> Diagram f a s m (Free f a s)
- bind :: (Hashable1 f, Hashable a, Eq1 f, Eq a, Monad m, Traversable f) => Free f a s -> (a -> Diagram f a s m (Free f a s)) -> Diagram f a s m (Free f a s)
- fold :: (Monad m, Traversable f) => (f b -> Diagram f a s m b) -> (a -> Diagram f a s m b) -> Free f a s -> Diagram f a s m b
Diagrams
data Diagram f a s m r Source #
The diagram records overlapping terms:
fis the functor from which the Free terms are build.ais the type of leaves or terminals.sis a phantom type labelling the diagram and preventing leaking.
Instances
| MonadTrans (Diagram f a s) Source # | |
Defined in Data.Diagram | |
| Monad m => Monad (Diagram f a s m) Source # | |
| Functor m => Functor (Diagram f a s m) Source # | |
| Monad m => Applicative (Diagram f a s m) Source # | |
Defined in Data.Diagram Methods pure :: a0 -> Diagram f a s m a0 # (<*>) :: Diagram f a s m (a0 -> b) -> Diagram f a s m a0 -> Diagram f a s m b # liftA2 :: (a0 -> b -> c) -> Diagram f a s m a0 -> Diagram f a s m b -> Diagram f a s m c # (*>) :: Diagram f a s m a0 -> Diagram f a s m b -> Diagram f a s m b # (<*) :: Diagram f a s m a0 -> Diagram f a s m b -> Diagram f a s m a0 # | |
runDiagram :: Monad m => (forall s. Diagram f a s m b) -> m b Source #
Extract non-diagrammatic information
compress :: Monad m => Diagram f a s m b -> Diagram f a s Identity (m b) Source #
Remove diagrmmatic information from the underlying monad. This could have problematic side-effects and should be used with caution
Nodes
data Free (f :: * -> *) a s Source #
The Free monad parameterised by it's diagram. Approximately it corresponds to a non-terminal or sub-diagram
Constructors
| Pure a |
Instances
| Eq a => Eq (Free f a s) Source # | |
| Ord a => Ord (Free f a s) Source # | |
| Generic (Free f a s) Source # | |
| Hashable a => Hashable (Free f a s) Source # | |
Defined in Data.Diagram | |
| type Rep (Free f a s) Source # | |
Defined in Data.Diagram type Rep (Free f a s) = D1 ('MetaData "Free" "Data.Diagram" "zsdd-0.2.1.0-inplace" 'False) (C1 ('MetaCons "Pure" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)) :+: C1 ('MetaCons "ID" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int))) | |
free :: (Monad m, Hashable1 f, Hashable a, Eq1 f, Eq a) => f (Free f a s) -> Diagram f a s m (Free f a s) Source #
Analogous to the Free constructor, this fuction wraps another functorial layer. In a graph setting, this corresponds to creating a node from it's offspring structure
fromFree :: Monad m => Free f a s -> (f (Free f a s) -> Diagram f a s m b) -> (a -> Diagram f a s m b) -> Diagram f a s m b Source #
retract :: (Monad f, Traversable f) => Free f a s -> Diagram f a s f a Source #
When f is monadic itself, retract will collapse the recursive structure
Combinators
map :: (Hashable1 f, Hashable a, Eq1 f, Eq a, Monad m, Traversable f) => (a -> Diagram f a s m a) -> Free f a s -> Diagram f a s m (Free f a s) Source #
Apply a function to all terminals in a Free sub-diagram