WriterT
モナド変換子三種の神器(ReaderT, WriterT, StateT)のうちの一つ。
code: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🔁が登場した。