1

我正在玩这个 writer monad 日志记录示例:

http://monads.haskell.cz/examples/example17.hs

我将它用作一个玩具问题来弄清楚如何使用 writer monad 进行日志记录。我正在尝试修改程序,以便它输出每一行的日期时间。我最初的想法是这样修改logMsg

-- add a message to the log
logMsg :: String -> Writer [Entry] ()
logMsg s = do
  datetime <- getClockTime
  tell [Log 1 (datetime ++ " " ++ s)]

但是,这不会编译。我想我需要在IO某处插入。在哪里?帮助!

4

2 回答 2

1

通常的方法是不在 writer monad 本身中使用 IO,而是让它返回日志条目,然后在 runWriterT 返回后使用这些条目。这是一个程序,它总结了它的参数并记录了它们中的每一个:https ://gist.github.com/zsol/4741625

于 2013-02-08T20:46:28.803 回答
1

Writer是类型别名 t WriterT w Identity,因此您可以使用IO内部 monad 而不是创建别名Identity,例如:

type WriterIO = Writer w IO

您可以通过例如liftIO使用 IO ,例如:

-- add a message to the log
logMsg :: String -> WriterIO [Entry] ()
logMsg s = do
    datetime <- liftIO getClockTime
    tell [Log 1 (show datetime ++ " " ++ s)]   
于 2013-02-08T12:54:45.543 回答