haskell记录日期时间

时间:2013-02-08 12:20:24

标签: haskell

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

type WriterIO = Writer w IO

您可以使用IO via,例如liftIO,例如:

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

答案 1 :(得分:1)

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