我正试图从IO中“恢复”monadic计算,并担心我可能会失去运气。情况如下:
ioBracketFoo :: (a - > IO b) -> IO b
withBar :: MonadIO m => (a -> m b) -> m b
withBar action = liftIO $ ioBracketFoo $ \foo -> runMagic (action f)
基本上我想从ioBracketFoo中恢复我的(未知)monadic计算。如果它不是包围函数,那么我将能够使用res <- liftIO getFoo
获取资源并稍后释放它,而且我不必从IO中恢复我的monadic计算。
是否有其他创造性的lift
或类似用途可以使这成为可能?
答案 0 :(得分:2)
此问题由MonadBaseControl解决。 MonadBaseControl
提供存储和重新启动monadic计算的函数。你需要一个额外的依赖MonadBaseControl
,这将阻止在你的括号函数中使用不可用的monad,例如
fp-complete有一个教程,应该回答所有基本问题。