Haskell 如何从MonadBaseControl IO m调用liftIO?

Haskell 如何从MonadBaseControl IO m调用liftIO?,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我正在编写一个函数publish,它需要执行一些IO,还需要在MonadBaseControl IO m中调用一个函数。下面的工作可以完成,但我想摆脱MonadIO的约束,因为它应该与MonadBaseControl冗余 publish :: (MonadIO m, MonadBaseControl IO m) => m () publish = withResource $ \r -> liftIO $ someIOAction r 在Data.Pool中定义,并具有

我正在编写一个函数
publish
,它需要执行一些
IO
,还需要在
MonadBaseControl IO m
中调用一个函数。下面的工作可以完成,但我想摆脱
MonadIO
的约束,因为它应该与
MonadBaseControl
冗余

publish :: (MonadIO m, MonadBaseControl IO m) => m ()
publish =
  withResource $ \r ->
    liftIO $ someIOAction r
在Data.Pool中定义,并具有
MonadBaseControl IO m
约束

someIOAction
的类型为
r->IO()

我读过这个问题,但我不知道如何摆脱第二个约束:


如果我删除了
MonadIO m
,那么我就不再有
liftIO
。如何从
MonadBaseControl执行IO操作?

您要查找的是属于
MonadBaseControl
的超类的类:

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

因此,您可以
liftBase$someIOAction r

您要查找的是一个类,它是
MonadBaseControl
的超类:

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

所以你可以
liftBase$someIOAction r

不是
liftBase
而不是
liftIO
?不是
liftBase
而不是
liftIO
?谢谢!我没有意识到这是一个超类,我认为这是一个单独的努力。谢谢谢谢我没有意识到这是一个超类,我认为这是一个单独的努力。谢谢