Как мне войти в Haskell?

Я пытаюсь использовать HSlogger, чтобы получить некоторую информацию о моей программе. Поэтому я добавляю следующую строку в свою функцию

import Data.Word
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import Data.Bits
import Data.Int
import Data.ByteString.Parser

import System.Log.Logger
import System.Log.Handler.Syslog


importFile :: FilePath -> IO (Either String (PESFile ))
importFile n = do
     warningM "MyApp.Component2" "Something Bad is about to happen."
     ...

. И это прекрасно работает, потому что функция находится внутри ввода-вывода. Однако, когда я добавляю аналогичную строку к следующей функции:

...
parsePES :: Parser PESFile
parsePES = do
        header <- string "#PES"
        warningM "parsing header"
        ...
        return (PESFile ...)

, я получаю ошибку типа:

 Couldn't match expected type `Parser a0'
                with actual type `String -> IO ()'
    In the return type of a call of `warningM'
    In a stmt of a 'do' expression: warningM "parsing header"
    In the expression:
      do { header <- string "#PES";
           warningM "parsing header";
        ...

И я полностью понимаю, почему - parsePES находится в монаде Parser, а не в монаде ввода-вывода. Я не понимаю, что с этим делать. Нужен ли мне преобразователь монад, чтобы я мог объединить монаду Parser и монаду ввода-вывода? Как мне это сделать?

44
задан user2864740 18 January 2015 в 00:08
поделиться