Portability | portable |
---|---|

Stability | experimental |

This module provides Arrow-like monad composition for transformers. To be more precise, it is Category-like,
i.e. the parallels are to `Control.Category.Category`

.

*This version has been adapted from monadLib-compose, to work with the transformers package.*

`Control.Category.Category`

generalises `.`

and `id`

to arrows and categories. One such arrow is `Kleisli`

,
which represents functions returning monadic values. Incidentally, that's equivalent to `ReaderT`

! So it
turns out that it is possible to generalise `.`

and `id`

to `ReaderT`

(`id`

is just `ask`

), as well as to
many monad transformer stacks that embed a `ReaderT`

inside.

- class (Monad m, Monad n) => MonadCompose m n s t | m -> s, n -> t, n s -> m where
- (<<<) :: MonadCompose m n s t => m a -> n s -> n a
- (>>>) :: MonadCompose m n s t => n s -> m a -> n a

# Documentation

class (Monad m, Monad n) => MonadCompose m n s t | m -> s, n -> t, n s -> m whereSource

Composable monads. Compare with `Control.Category.Category`

.
Note that there are two different monad types involved in each instance.

mcompose :: m a -> n s -> n aSource

Compose two monadic values from right to left. `mcompose f g`

is
comparable to `f . g`

but for monadic values. Compare with `Control.Category..`

.

mapply :: m a -> s -> n aSource

Apply a constant value to a composable monad.

MonadCompose ((->) s) ((->) t) s t | |

MonadCompose m n s t => MonadCompose (MaybeT m) (MaybeT n) s t | |

MonadCompose m n s t => MonadCompose (IdentityT m) (IdentityT n) s t | |

(MonadCompose m n s t, Monoid w) => MonadCompose (WriterT w m) (WriterT w n) s t | |

(MonadCompose m n s t, Monoid w) => MonadCompose (WriterT w m) (WriterT w n) s t | |

MonadCompose m n s t => MonadCompose (StateT i m) (StateT i n) s t | |

MonadCompose m n s t => MonadCompose (StateT i m) (StateT i n) s t | |

Monad m => MonadCompose (ReaderT s m) (ReaderT t m) s t | |

(MonadCompose m n s t, Error e) => MonadCompose (ErrorT e m) (ErrorT e n) s t | |

(Monad m, Monoid w) => MonadCompose (RWST s w i m) (RWST t w i m) s t | |

(Monad m, Monoid w) => MonadCompose (RWST s w i m) (RWST t w i m) s t |

(<<<) :: MonadCompose m n s t => m a -> n s -> n aSource

Compose two monadic values from right to left. Compare with `Control.Category.<<<`

.
`f <<< g`

is equivalent to `mcompose f g`

.

(>>>) :: MonadCompose m n s t => n s -> m a -> n aSource

Compose two monadic values from left to right. Compare with `Control.Category.>>>`

.
`g >>> f`

is equivalent to `mcompose f g`

.