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
?谢谢!我没有意识到这是一个超类,我认为这是一个单独的努力。谢谢谢谢我没有意识到这是一个超类,我认为这是一个单独的努力。谢谢