我有這個很簡單的功能有沒有辦法從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