Haskell:恢复IO内部的monadic计算

时间:2014-07-29 21:14:57

标签: haskell io monads

我正试图从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或类似用途可以使这成为可能?

1 个答案:

答案 0 :(得分:2)

此问题由MonadBaseControl解决。 MonadBaseControl提供存储和重新启动monadic计算的函数。你需要一个额外的依赖MonadBaseControl,这将阻止在你的括号函数中使用不可用的monad,例如

fp-complete有一个教程,应该回答所有基本问题。