[Haskell-cafe] generalizing the writer monad