f :: WriterT [String] IO a

comb = do a <- f ; b <- f ; c <- f ; return (g a b c)

bar = do (_, log) <- runWriterT comb ; mapM_ h log

この場合、hがlogの先頭だけしか必要としない場合でも、
f内で行われるIOの動作は3回分きっちり実行されますよね。
これをfが評価される度にhを実行するようにしたいんですが、どうすればいいんでしょうか?

例えばf内でgetLineを使ってるようなとき、
barで入力される度にhがf内のtellで追加された分のログに対して実行されるような動作です