我有这个很简单的功能有没有办法从IO monad中打开一个类型?
import qualified Data.ByteString.Lazy as B
getJson :: IO B.ByteString
getJson = B.readFile jsonFile
readJFile :: IO (Maybe Response)
readJFile = parsing >>= (\d ->
case d of
Left err -> return Nothing
Right ps -> return (Just ps))
where parsing = fmap eitherDecode getJson :: IO (Either String Response)
其中jsonFile
是对我的硬盘文件的路径(原谅缺乏DO-符号的,但我发现这更清晰一起工作)
我问题是;有没有办法让我去掉IO
部分,这样我就可以单独处理字节串了?
我知道,你可以在某些单子像Either
和Maybe
得到他们的价值观出模式匹配,但你可以做IO
类似的东西?
或者有别于:有没有办法让我readJFile
返回Maybe Response
没有IO?
可能的重复:http://stackoverflow.com/questions/8567743/how-to-extract-value-from-monadic-action – Teetoo
我不是在谈论内置的东西,但我只是要求做到这一点的一种方式,也许我可以构建自己;我的代码看起来现在我必须通过5个函数拖动IO IO monad,并且公平地将它混乱很多,特别是考虑到我只在这个ONE函数中执行IO操作并且无法执行其他任何操作 –
您从不需要通过任何函数“拖拽monad”,除非它们都需要实际执行IO。只需用'fmap'(或'liftM' /'liftM2'/...)将整个链条提升到monad中。 – leftaroundabout