我正在玩这个作家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
。哪里?救命啊!
答案 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