generated at
WriterT

haskell
newtype WriterT w m a = WriterT { runWriterT :: m (a, w) } instance (Monoid w, Monad m) => Monad (WriterT w m) where m >>= k = WriterT $ do (a, w) <- runWriterT m (b, w') <- runWriterT (k a) return (b, w `mappend` w') {-# INLINE (>>=) #-}

モナドのインスタンスは、二つのアクションを実行してから最後に値を結合するという動きのためメモリリークが起こり、せいぜいApplicativeの部品としてしか実用性がなかった。近年、その欠点を克服したControl.Monad.Trans.Writer.CPS🔁が登場した。