我正在写一个函数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?
答案 0 :(得分:4)
您正在寻找的是MonadBase
类,它是MonadBaseControl
的超类:
class (Applicative b, Applicative m, Monad b, Monad m) =>
MonadBase (b :: * -> *) (m :: * -> *) | m -> b where
liftBase :: b α -> m α
所以你可以liftBase $ someIOAction r
。