from Control.Applicative import class Applicative
from Control.Monad import class Monad
-from Data.Void import :: Void
+from Control.Monad.Trans import class MonadTrans
from Data.Functor import class Functor
from Data.Functor.Identity import :: Identity
from Data.Monoid import class Monoid, class Semigroup
+// The RWS monad
:: RWS r w s a :== RWST r w s Identity a
+rws :: (r -> s -> (a, s, w)) -> RWS r w s a
+runRWS :: (RWS r w s a) r s -> (a, s, w)
+evalRWS :: (RWS r w s a) r s -> (a, w)
+execRWS :: (RWS r w s a) r s -> (s, w)
+mapRWS :: ((a, s, w) -> (b, s, w`)) (RWS r w s a) -> RWS r w` s b
+withRWS :: (r` s -> (r, s)) (RWS r w s a) -> RWS r` w s a
+
// The RWST monad transformer
:: RWST r w s m a = RWST (r s -> m (a, s, w))
instance Functor (RWST r w s m) | Monad m & Monoid w
instance Applicative (RWST r w s m) | Monad m & Monoid w
instance Monad (RWST r w s m) | Monad m & Monoid w
+instance MonadTrans (RWST r w s) | Monoid w
runRWST :: (RWST r w s m a) r s -> m (a, s, w)
evalRWST :: (RWST r w s m a) r s -> m (a, w) | Monad m
asks :: (r -> a) -> RWST r w s m a | Monoid w & Monad m
// Writer operations
-tell :: w -> RWST r w s m Void | Monoid w & Monad m
+tell :: w -> RWST r w s m () | Monoid w & Monad m
listen :: (RWST r w s m a) -> RWST r w s m (a, w) | Monoid w & Monad m
pass :: (RWST r w s m (a, w -> w)) -> RWST r w s m a | Monoid w & Monad m
listens :: (w -> b) (RWST r w s m a) -> RWST r w s m (a, b)| Monoid w & Monad m
// State operations
get :: RWST r w s m s | Monoid w & Monad m
-put :: s -> RWST r w s m Void | Monoid w & Monad m
-modify :: (s -> s) -> RWST r w s m Void | Monoid w & Monad m
+put :: s -> RWST r w s m () | Monoid w & Monad m
+modify :: (s -> s) -> RWST r w s m () | Monoid w & Monad m
gets :: (s -> a) -> RWST r w s m a | Monoid w & Monad m
// Lifting other operations