【问题标题】:How to call liftIO from MonadBaseControl IO m?如何从 MonadBaseControl IO m 调用 liftIO?
【发布时间】:2016-10-12 20:43:19
【问题描述】:

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

【问题讨论】:

  • 难道你只需要liftBase 而不是liftIO

标签: haskell monads monad-transformers


【解决方案1】:

您正在寻找的是MonadBase 类,它是MonadBaseControl 的超类:

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

所以你可以liftBase $ someIOAction r

【讨论】:

  • 谢谢!我没有意识到这是一个超类,我认为这是一个单独的努力。谢谢!
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
相关资源
最近更新 更多