@@ -9,7 +9,11 @@ import Prelude.Functor
99%access public
1010
1111class (Monoid w, Monad m) => MonadWriter w (m : Type -> Type) where
12− tell : w -> m ()
12+ tell : w -> m ()
13+ listen : m a -> m (a, w)
14+ listens : (w -> b) -> m a -> m (a, b)
15+ pass : m (a, w -> w) -> m a
16+ censor : (w -> w) -> m a -> m a
1317
1418record WriterT : Type -> (Type -> Type) -> Type -> Type where
1519 WR : {m : Type -> Type} ->
@@ -34,7 +38,15 @@ instance (Monoid w, Monad m) => Monad (WriterT w m) where
3438 return (b, w <+> w')
3539
3640instance (Monoid w, Monad m) => MonadWriter w (WriterT w m) where
37− tell w = WR $ return ((), w)
41+ tell w = WR $ return ((), w)
42+ listen (WR m) = WR $ do (a, w) <- m
43+ return ((a, w), w)
44+ listens f (WR m) = WR $ do (a, w) <- m
45+ return ((a, f w), w)
46+ pass (WR m) = WR $ do ((a, f), w) <- m
47+ return (a, f w)
48+ censor f (WR m) = WR $ do (a, w) <- m
49+ return (a, f w)
3850
3951
4052Writer : Type -> Type -> Type