如何在Parsec的monad中执行IO?

时间:2014-01-17 07:35:28

标签: haskell io monads parsec

我正在使用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中?有没有办法让我明白这个?

1 个答案:

答案 0 :(得分:5)

您需要使用Control.Monad.Trans包中mtl的{​​{3}}将IO上的操作转换为ParsecT s0 u0 IO

contents <- liftIO $ BS.readFile fileName
results  <- liftIO $ decodeImage contents