我正在使用Parsec将包含FilePath
的简单文件读取到其他图像。
例如
img ../images/test.gif
img ../../gifs/image.png
我想一次解析每一行,以ByteString
的形式读取图像,并将其包裹在Parsec的monad中。但是,一个看起来像这样的函数:
filename <- getName
contents <- BS.readFile fileName
results <- decodeImage contents
let image = case results of
Left err -> error $ show err
Right img -> img
return results
抛出错误
Couldn't match type `IO' with `ParsecT s0 u0 m0'
Expected type: ParsecT s0 u0 m0 BS.ByteString
Actual type: IO BS.ByteString
我不太确定monad是如何工作的 - 但它似乎将它包装在错误的monad中?有没有办法让我明白这个?
答案 0 :(得分:5)
您需要使用Control.Monad.Trans
包中mtl
的{{3}}将IO
上的操作转换为ParsecT s0 u0 IO
:
contents <- liftIO $ BS.readFile fileName
results <- liftIO $ decodeImage contents