如何从 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
.
我正在写一个函数 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?
您要找的是 MonadBase
class,它是 MonadBaseControl
:
class (Applicative b, Applicative m, Monad b, Monad m) =>
MonadBase (b :: * -> *) (m :: * -> *) | m -> b where
liftBase :: b α -> m α
所以你可以liftBase $ someIOAction r
.