module Problem2 where
import Data.Monoid
newtype Writer w a = Writer { runWriter :: (a, w) }
-- a)
instance Monoid w => Monad (Writer w) where
return x = Writer (x, mempty)
m >>= f = Writer (y, mappend w1 w2)
where
(x, w1) = runWriter m
(y, w2) = runWriter (f x)
-- b)
tell :: w -> Writer w ()
tell w = Writer ((), w)
listen :: Writer w a -> Writer w (a, w)
listen m = Writer ((x, w), w)
where
(x, w) = runWriter m