Safe Haskell | Safe-Inferred |
---|
This module implements "ListT done right" in terms of proxies.
The RespondT
monad transformer is the ListT
monad transformer over the
downstream output type. Each respond
corresponds to an element of the
list. The monad bind operation non-deterministically selects one of the
previous respond
s as input. The RespondT
Kleisli category corresponds
to the "respond" category of the ListT
class.
Symmetrically, the RequestT
monad transformer is the ListT
monad
transformer over the upstream output type. Each request
corresponds to an
element of the list. The monad bind operation non-deterministically selects
one of the previous request
s as input. The RequestT
Kleisli category
corresponds to the "request" category of the ListT
class.
Unlike ListT
from transformers
, these monad transformers are correct by
construction and always satisfy the monad and monad transformer laws.
- newtype RespondT p a' a b' m b = RespondT {
- runRespondT :: p a' a b' b m b'
- runRespondK :: (q -> RespondT p a' a b' m b) -> q -> p a' a b' b m b'
- type ProduceT p = RespondT p C () ()
- newtype RequestT p a b' b m a' = RequestT {
- runRequestT :: p a' a b' b m a
- runRequestK :: (q -> RequestT p a b' b m a') -> q -> p a' a b' b m a
- type CoProduceT p = RequestT p () () C
- class Proxy p => ListT p where
- (\>\) :: (Monad m, ListT p) => (b' -> p a' a x' x m b) -> (_c' -> p b' b x' x m c) -> _c' -> p a' a x' x m c
- (/>/) :: (Monad m, ListT p) => (_a -> p x' x b' b m a') -> (b -> p x' x c' c m b') -> _a -> p x' x c' c m a'
- (/</) :: (Monad m, ListT p) => (_c' -> p b' b x' x m c) -> (b' -> p a' a x' x m b) -> _c' -> p a' a x' x m c
- (\<\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> (_a -> p x' x b' b m a') -> _a -> p x' x c' c m a'
- (//<) :: (Monad m, ListT p) => p b' b x' x m c -> (b' -> p a' a x' x m b) -> p a' a x' x m c
- (<\\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> p x' x b' b m a' -> p x' x c' c m a'
Respond Monad Transformer
newtype RespondT p a' a b' m b Source
A monad transformer over a proxy's downstream output
RespondT | |
|
ListT p => MonadTrans (RespondT p a' a b') | |
(Monad m, ListT p) => Monad (RespondT p a' a b' m) | |
(Monad m, ListT p) => Functor (RespondT p a' a b' m) | |
(Monad m, ListT p, Monoid b') => MonadPlus (RespondT p a' a b' m) | |
(Monad m, ListT p) => Applicative (RespondT p a' a b' m) | |
(Monad m, ListT p, Monoid b') => Alternative (RespondT p a' a b' m) | |
(MonadIO m, ListT p) => MonadIO (RespondT p a' a b' m) |
runRespondK :: (q -> RespondT p a' a b' m b) -> q -> p a' a b' b m b'Source
Convert a RespondT
'K
'leisli arrow into a proxy
Request Monad Transformer
newtype RequestT p a b' b m a' Source
A monad transformer over a proxy's upstream output
RequestT | |
|
ListT p => MonadTrans (RequestT p a' a b') | |
(Monad m, ListT p) => Monad (RequestT p a b' b m) | |
(Monad m, ListT p) => Functor (RequestT p a b' b m) | |
(Monad m, ListT p, Monoid a) => MonadPlus (RequestT p a b' b m) | |
(Monad m, ListT p) => Applicative (RequestT p a b' b m) | |
(Monad m, ListT p, Monoid a) => Alternative (RequestT p a b' b m) | |
(MonadIO m, ListT p) => MonadIO (RequestT p a b' b m) |
runRequestK :: (q -> RequestT p a b' b m a') -> q -> p a' a b' b m aSource
Convert a RequestT
'K
'leisli arrow into a proxy
type CoProduceT p = RequestT p () () CSource
CoProduceT
is isomorphic to "ListT done right"
ListT
class Proxy p => ListT p whereSource
The two generalized "ListT" categories
(\>\) :: (Monad m, ListT p) => (b' -> p a' a x' x m b) -> (_c' -> p b' b x' x m c) -> _c' -> p a' a x' x m cSource
(/>/) :: (Monad m, ListT p) => (_a -> p x' x b' b m a') -> (b -> p x' x c' c m b') -> _a -> p x' x c' c m a'Source
Flipped operators
(/</) :: (Monad m, ListT p) => (_c' -> p b' b x' x m c) -> (b' -> p a' a x' x m b) -> _c' -> p a' a x' x m cSource
Equivalent to (\>\
) with the arguments flipped
(\<\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> (_a -> p x' x b' b m a') -> _a -> p x' x c' c m a'Source
Equivalent to (/>/
) with the arguments flipped
(//<) :: (Monad m, ListT p) => p b' b x' x m c -> (b' -> p a' a x' x m b) -> p a' a x' x m cSource
Equivalent to (>\\
) with the arguments flipped
(<\\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> p x' x b' b m a' -> p x' x c' c m a'Source
Equivalent to (//>
) with the arguments flipped
Laws
The ListT
class defines the ability to:
Laws:
return = respond (>=>) = (//>)
return = request (>>=) = (//<)
Additionally, (\>\
) and (/>/
) both define functors between Proxy Kleisli
categories:
a \>\ (b >=> c) = (a \>\ b) >=> (a \>\ c) a \>\ return = return
(b >=> c) />/ a = (b />/ a) >=> (c />/ a) return />/ a = return