Copyright | (c) Eddie Jones 2020 |
---|---|
License | BSD-3 |
Maintainer | eddiejones2108@gmail.com |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
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:
f
is the functor from which the Free terms are build.a
is the type of leaves or terminals.s
is 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 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
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.0.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