为什么我不能用 MonadReader 约束调用 ask

Why can't I call ask with MonadReader constraint

我正在尝试在具有 MonadReader 约束的 do 符号块中调用 ask,但我收到有关刚性类型的错误。据我所知,ask 是为所有 MonadReaders ?

定义的
bar :: MonadReader r m => m r
bar = do
  i <- ask
  return i

这个returns这个

• Couldn't match type ‘m’ with ‘ReaderT r m0’
  ‘m’ is a rigid type variable bound by
    the type signature for:
      bar :: forall r (m :: * -> *). MonadReader r m => m r
    at mem.hs:50:8
  Expected type: m r
    Actual type: ReaderT r m0 r
• In a stmt of a 'do' block: i <- ask
  In the expression:
    do { i <- ask;
         return i }
  In an equation for ‘bar’:
      bar
        = do { i <- ask;
               return i }

您似乎从 Control.Monad.Trans.Reader 导入了 ask,但从 Control.Monad.Reader 导入了 MonadReaderControl.Monad.Trans.Reader 中的 ask 函数是单态的,它只适用于 ReaderT。只需单独导入 Control.Monad.Reader——它会重新导出 ReaderT,但它提供了 asklocalreader.[=22= 的通用版本]