Я пытаюсь использовать 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 и монаду ввода-вывода? Как мне это сделать?