もなもなモナド ReaderモナドとWriterモナドの合成について
疑問には答えられてないんですが、lift,liftMはいらないのかな、と。
*Main> :i MonadReader class (Monad m) => MonadReader r m | m -> r where ask :: m r local :: (r -> r) -> m a -> m a -- Defined in Control.Monad.Reader.Class instance (Monoid w, MonadReader r m) => MonadReader r (WriterT w m) -- Defined in Control.Monad.Writer.Lazy (以下、略)
だから
main3 = runReader (runWriterT (sum_leaf_wr sample)) "" sum_leaf_wr :: T -> WriterT [String] (Reader String) Int sum_leaf_wr (L n) = do parent <- ask tell ["parent:" ++ parent ++ ", " ++ show n] return n sum_leaf_wr (B parent children) = do n_list <- mapM (local (const parent) . sum_leaf_wr) children return (sum n_list)