将monad转换为IO

Tyc*_*cho 4 monads haskell

finally签名,我想用IO a -> IO b -> IO a.

但是,我想要使用的操作是基于不同的monad IO(即Servant's ClientM).

我知道liftIO,但这似乎恰恰相反 - IO a -> m a.

我怎样才能将我的monad转换为IO,或者升级finally以便在我的monad上运行?

Ale*_*lec 9

请注意,ClientM还有一个MonadBaseControl IO ClientM用于此类事情的实例.例如,我认为以下应该是typecheck(并且可以与之一起使用m ~ ClientM).

finally' :: MonadBaseControl IO m => m a -> m b -> m a
finally' x y = control $ \runInIO -> catch (runInIO x) (runInIO y)
Run Code Online (Sandbox Code Playgroud)

编辑

不仅是上面的类型检查,而且它被定义lifted-basefinally.