2013-02-08 45 views
1

我玩弄這個作家單子記錄例如:哈斯克爾記錄與日期時間

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

我使用它作爲一個玩具問題搞清楚如何使用一個作家單子做記錄。 我想修改程序,所以它輸出每行的日期時間。 我最初的想法是修改logMsg這樣的:

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

但是,這並不編譯。我想我需要在某處插入IO。哪裏?幫幫我!

回答

1

Writer是一個類型別名牛逼WriterT w Identity,這樣你就可以IO內單子,而不是Identity,像創建別名:

type WriterIO = Writer w IO 

而且你可以通過使用IO,例如liftIO,如:

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

'type WriterIO = WriterT IO Identity'不會編譯,第一個參數是用於記錄的'Monoid'。你可能是指'輸入WriterIO w = WriterT w IO'。 – 2013-02-08 13:49:54

+0

好吧,我也改變了runWriter runWriterT,但現在它說:不能匹配預期類型'(,)t0'與實際類型'IO' 預期類型:WriterT [Entry]((,)t0)a0 Actual類型:WriterIO [條目] [數據包] 在filterAll的呼叫的返回類型中 'runWriterT'的第一個參數,即 '(filterAll規則數據包)' – 2013-02-08 14:10:21

1

通常的方法是不使用IO在作家單子本身,而是讓它迴歸的日誌條目,然後使用這些runWriterT返回之後。 下面是一個程序,它總結了它的參數,並且記錄它們中的每一個:https://gist.github.com/zsol/4741625

+1

我想標記日誌行日期=) – 2013-02-08 21:35:59