如何从MonadBaseControl IO m调用liftIO?

时间:2016-10-12 20:43:19

标签: haskell monads monad-transformers

我正在写一个函数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操作

1 个答案:

答案 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