I see many beginners use WriterT [a] in their programs to log outputs like this: import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Writer import Prelude hiding (log) log :: Monad m => String -> WriterT [String] m () log string = tell [string] example :: WriterT [String] IO () example = do log "Printing 1 ..." lift $ print 1 log "Printing 2 ..." lift $ print 2 main = do strings <-