Я пытаюсь использовать 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."
...
И это прекрасно работает, потому что функция находится внутри IO. Однако, когда я добавляю подобную строку к следующей функции:
...
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, а не в монаде IO. Я не понимаю, что с этим делать. Нужен ли мне монадный трансформатор, чтобы я мог складывать монаду Parser и монаду IO вместе? Как мне это сделать?