@@ -9,7 +9,11 @@ import Prelude.Functor
9%access public
9%access public
11class (Monoid w, Monad m) => MonadWriter w (m : Type -> Type) where
11class (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
14record WriterT : Type -> (Type -> Type) -> Type -> Type where
18record WriterT : Type -> (Type -> Type) -> Type -> Type where
15 WR : {m : Type -> Type} ->
19 WR : {m : Type -> Type} ->
@@ -34,7 +38,15 @@ instance (Monoid w, Monad m) => Monad (WriterT w m) where
34 return (b, w <+> w')
38 return (b, w <+> w')
36instance (Monoid w, Monad m) => MonadWriter w (WriterT w m) where
40instance (Monoid w, Monad m) => MonadWriter w (WriterT w m) where
41+ tell w = WR $ return ((), w)
42+ listen (WR m) = WR $ do (a, w) <- m
37− tell w = WR $ return ((), w)
43+ return ((a, w), w)
44+ listens f (WR m) = WR $ do (a, w) <- m
46+ pass (WR m) = WR $ do ((a, f), w) <- m
48+ censor f (WR m) = WR $ do (a, w) <- m
40Writer : Type -> Type -> Type
52Writer : Type -> Type -> Type