如何从 MonadBaseControl IO m 调用 liftIO?

How to call liftIO from MonadBaseControl IO m?

我正在写一个函数 publish,它需要做一些 IO,还要调用 MonadBaseControl IO m 中的一个函数。下面的工作,但我想得到摆脱 MonadIO 的约束,因为它应该与 MonadBaseControl

是多余的
publish :: (MonadIO m, MonadBaseControl IO m) => m ()
publish =
  withResource $ \r ->
    liftIO $ someIOAction r

withResource 在 Data.Pool 中定义,并具有 MonadBaseControl IO m 约束。

someIOAction 具有类型 r -> IO ()

我读过这个问题,但我不知道如何摆脱第二个约束:Is there any difference between "MonadIO m" and "MonadBaseControl IO m"?

如果我删除 MonadIO m 那么我就没有 liftIO 了。如何从 MonadBaseControl?

执行 IO 操作

您要找的是 MonadBase class,它是 MonadBaseControl:

的超级class
class (Applicative b, Applicative m, Monad b, Monad m) =>
      MonadBase (b :: * -> *) (m :: * -> *) | m -> b where
  liftBase :: b α -> m α

所以你可以liftBase $ someIOAction r.