import Data.Functor
import Data.Monoid
import Control.Monad
+import Control.Monad.Trans
import Control.Applicative
// The RWS monad
>>= \(a, s`, w)->runRWST (k a) r s`
>>= \(b, s``,w`)->pure (b, s``, mappend w w`)
+instance MonadTrans (RWST r w s) | Monoid w where
+ liftT m = RWST \_ s->m >>= \a->pure (a, s, mempty)
+
runRWST :: (RWST r w s m a) r s -> m (a, s, w)
runRWST (RWST f) r s = f r s