2013-02-08 3 views
1

Я играл с этим писателем монады каротажного например:Haskell каротаж с DateTimes

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, например:

+2

'type WriterIO = WriterT IO Identity' не будет компилироваться, первым параметром является« Monoid », используемый для ведения журнала. Вероятно, вы имели в виду 'type WriterIO w = WriterT w IO'. –

+0

ОК, я также изменил runWriter на runWriterT, но теперь он говорит: Не удалось совместить ожидаемый тип '(,) t0 'с фактическим типом' IO' Ожидаемый тип: WriterT [Entry] ((,) t0) a0 Фактический type: WriterIO [Entry] [Packet] В обратном типе вызова 'filterAll ' В первом аргументе' runWriterT', а именно '(filterAll rules packages) ' –

1

Обычный подход заключается не в использовании IO в самой монашке-писателе, а в том, чтобы возвращать записи журнала, а затем использовать те, которые были возвращены после запуска runWriterT. Вот программа, которая суммирует его аргументы, а также регистрирует каждый из них: https://gist.github.com/zsol/4741625

+1

Я хочу пометить строки журнала с помощью date =) –