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どこかに挿入する必要があると思います。どこ?ヘルプ!

4

2 に答える 2

1

通常のアプローチは、Writer モナド自体で IO を使用するのではなく、ログ エントリを返してから、runWriterT が返された後にそれらを使用することです。これは、引数を合計し、それぞれをログに記録するプログラムです: https://gist.github.com/zsol/4741625

于 2013-02-08T20:46:28.803 に答える
1

Writerは型エイリアス tであるため、次のように の代わりに内部モナドをWriterT w Identity使用してエイリアスを作成できます。IOIdentity

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 に答える