This module provides Arrow-like monad composition for monadLib. To be more precise, it is Category-like,
i.e. the parallels are to
id to arrows and categories. One such arrow is
which represents functions returning monadic values. Incidentally, that's equivalent to
ReaderT! So it
turns out that it is possible to generalise
id is just
ask), as well as to
many monad transformer stacks that embed a
The motivation to create this module was a nagging feeling when reading the documentation for
composing filters is very nice, but the abundance of constant arrows, and the lack of access to the very extensive
set of monad combinators, leads to duplicated effort and unwieldy code (in my humble opinion). I think it is
possible to gain similar functionality with a stack of monad transformers including
- mid :: ReaderM m s => m s
- class (Monad m, Monad n) => ComposeM m n s t | m -> s, n -> t, n s -> m where
- (<<<) :: ComposeM m n s t => m a -> n s -> n a
- (>>>) :: ComposeM m n s t => n s -> m a -> n a
- derive_mcompose :: ComposeM m n s t => Iso m o -> Iso n p -> o a -> p s -> p a
- derive_mapply :: ComposeM m n s t => Iso m o -> Iso n p -> o a -> s -> p a
Composable monads. Compare with
Note that there are two different monad types involved in each instance.
Compose two monadic values from right to left.
mcompose f g is
f . g but for monadic values. Compare with
Apply a constant value to a composable monad.
|ComposeM ((->) s) ((->) t) s t|
|ComposeM (Reader s) (Reader t) s t|
|ComposeM m n s t => ComposeM (IdT m) (IdT n) s t|
|ComposeM m n s t => ComposeM (ChoiceT m) (ChoiceT n) s t|
|Monad m => ComposeM (ReaderT s m) (ReaderT t m) s t|
|(ComposeM m n s t, Monoid w) => ComposeM (WriterT w m) (WriterT w n) s t|
|ComposeM m n s t => ComposeM (StateT i m) (StateT i n) s t|
|ComposeM m n s t => ComposeM (ExceptionT e m) (ExceptionT e n) s t|
Compose two monadic values from right to left. Compare with
f <<< g is equivalent to
mcompose f g.
Compose two monadic values from left to right. Compare with
g >>> f is equivalent to
mcompose f g.