Haskell 将monad转换为IO
我想使用,签名Haskell 将monad转换为IO,haskell,monads,Haskell,Monads,我想使用,签名ioa->iob->ioa 然而,我想要使用的操作基于不同于IO(即的)的monad 我知道,但这似乎适得其反--ioa->ma 如何将我的monads转换为IOs,或最终提升以操作我的monads?请注意ClientM还有一个MonadBaseControl IO ClientM实例,用于此类操作。例如,我认为以下内容应该进行类型检查(并且可以与m~ClientM一起使用) 编辑 不仅上面的类型检查,而且它是在中定义的。似乎ClientM必须在某个点上与一起运行,这将其归结为IO
ioa->iob->ioa
然而,我想要使用的操作基于不同于IO
(即的)的monad
我知道,但这似乎适得其反--ioa->ma
如何将我的monads转换为IOs,或最终提升
以操作我的monads?请注意ClientM
还有一个MonadBaseControl IO ClientM
实例,用于此类操作。例如,我认为以下内容应该进行类型检查(并且可以与m~ClientM
一起使用)
编辑
不仅上面的类型检查,而且它是在中定义的。似乎ClientM
必须在某个点上与一起运行,这将其归结为IO
如果恰好适合您的情况,可能最简单的解决方案是使用finally
来包装由此产生的IO
操作。谢谢您的帮助!如果我想找到这个黑魔法,我会迷路的。不过,我在尝试使用它的MonadBaseControl
实例时,不知怎的遇到了一个错误——我把它作为一个新问题发布了。
finally' :: MonadBaseControl IO m => m a -> m b -> m a
finally' x y = control $ \runInIO -> catch (runInIO x) (runInIO y)