【问题标题】:Haskell: Resume monadic computation inside IOHaskell:在 IO 中恢复一元计算
【发布时间】:2014-07-29 21:14:56
【问题描述】:

我正在尝试从 IO 中“恢复”一元计算,并担心我可能会不走运。情况如下:

ioBracketFoo :: (a - > IO b) -> IO b

withBar :: MonadIO m => (a -> m b) -> m b
withBar action = liftIO $ ioBracketFoo $ \foo -> runMagic (action f)

基本上我想从 ioBracketFoo 中恢复我的(未知的)一元计算。如果它不是一个包围函数,那么我可以使用 res <- liftIO getFoo 获取资源并稍后释放它,我不必从 IO 中恢复我的一元计算。

是否有任何其他对lift 或类似的创造性使用来实现这一点?

【问题讨论】:

  • 看看MonadBaseControl。请参阅 fp-complete 上的本教程
  • 你看到提升基地的bracket了吗?
  • 感谢 Sebastian,MonadBaseControl 确实是我正在寻找的。教程也正是我所需要的。

标签: haskell io monads


【解决方案1】:

MonadBaseControl 解决了这个问题。 MonadBaseControl 提供了存储和重新启动一元计算的功能。您将需要对MonadBaseControl 的额外依赖,这将防止不可存储的 monad 在您的括号函数中使用,例如

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

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2011-01-14
    • 1970-01-01
    • 2019-03-28
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多