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
🔁
が登場した。