Safe Haskell | Safe |
---|---|
Language | Haskell98 |
A construction combining two monads, based on the work of Luth and Ghani, "Composing Monads Using Coproducts."
- data Composition m n t
- type (::+) m n = Yoneda (Composition m n)
- class Dist n where
- dist :: Applicative m => n (m t) -> n (m (n t))
- leftMap :: (Monad m, Functor n, Functor x) => (forall u. m u -> n u) -> (m ::+ x) t -> (n ::+ x) t
- rightMap :: (Monad x, Monad m, Functor n) => (forall u. m u -> n u) -> (x ::+ m) t -> (x ::+ n) t
- inl :: (Dist m, Dist n, Monad m, Monad n) => m t -> (m ::+ n) t
- inr :: (Dist m, Dist n, Monad m, Monad n) => n t -> (m ::+ n) t
- sym :: Monad m => (m ::+ m) t -> m t
- commute :: (Monad m, Monad n) => (m ::+ n) t -> (n ::+ m) t
- mapPlus :: (Monad m, Monad n, Functor m1, Functor n1) => (forall u. m u -> m1 u) -> (forall u. n u -> n1 u) -> (m ::+ n) t -> (m1 ::+ n1) t
- refl :: MonadPlus m => (m ::+ m) t -> m t
- data File t
- runFile :: File b -> FilePath -> IO b
- readLine :: File String
Documentation
data Composition m n t Source
Monad m => MonadTrans (Composition m) Source | |
(Dist m, Dist n, Monad m, Monad n) => Monad (Composition m n) Source | |
(Functor m, Functor n) => Functor (Composition m n) Source | |
(Dist m, Dist n, Monad m, Monad n) => Applicative (Composition m n) Source | |
(Dist m, Dist n, Monad m, MonadPlus n) => Alternative (Composition m n) Source | |
(Dist m, Dist n, Monad m, MonadPlus n) => MonadPlus (Composition m n) Source | |
(Dist m, Dist n, Monad m, Monad n, MonadIO n) => MonadIO (Composition m n) Source | |
(Dist m, Dist n, Monad m, Monad n) => Dist (Composition m n) Source |
type (::+) m n = Yoneda (Composition m n) Source
The following construction on two monads is a monad provided the two monads have extended distributive laws, defined below.
An extended distributive law allows one to permute two layers.
Laws are:
>>>
join . T dist = dist . join :: TTS -> TST
>>>
TS join . dist . dist = dist :: TS -> TST
dist :: Applicative m => n (m t) -> n (m (n t)) Source
Dist [] Source | |
Dist IO Source | |
Dist Identity Source | |
Dist Maybe Source | |
Dist File Source | |
Dist (Either t) Source | |
(Dist m, Functor m) => Dist (Yoneda m) Source | |
Dist (StateT s Identity) Source | |
Error e => Dist (ErrorT e Identity) Source | |
Monoid s => Dist (WriterT s Identity) Source | |
(Dist m, Dist n, Monad m, Monad n) => Dist (Composition m n) Source |
leftMap :: (Monad m, Functor n, Functor x) => (forall u. m u -> n u) -> (m ::+ x) t -> (n ::+ x) t Source
Left and right maps...
rightMap :: (Monad x, Monad m, Functor n) => (forall u. m u -> n u) -> (x ::+ m) t -> (x ::+ n) t Source
sym :: Monad m => (m ::+ m) t -> m t Source
If you have a ::+
over a monad, you can extract the underlying action.
mapPlus :: (Monad m, Monad n, Functor m1, Functor n1) => (forall u. m u -> m1 u) -> (forall u. n u -> n1 u) -> (m ::+ n) t -> (m1 ::+ n1) t Source
Example
Example of an IO-performing ADT.