Hackage - ReaderT 的 MonadReader 实现在哪里定义?

Hackage - Where is the MonadReader implementation for ReaderT defined?

我似乎无法找到定义两个相对简单的 Haskell 方法的位置。

大约 ReaderT。我正在按照 MonadReader 合同的要求寻找 asklocal 的实现。

https://hackage.haskell.org/package/mtl-2.1.2/docs/src/Control-Monad-Reader-Class.html#ask 我读到:

instance Monad m => MonadReader r (ReaderT r m) where
  ask = ReaderT.ask
  local = ReaderT.local

但是我在任何地方都找不到 ReaderT.askReaderT.local

第一次翻阅Hackage发现没有实现

我是不是漏掉了什么?

该文件包含导入语句

import qualified Control.Monad.Trans.Reader as ReaderT (ask, local, reader)

so ReaderT.ask 等参考 that module,来自 transformers-0.3.0.0 包([=13= 的唯一列出的依赖项)。如果你查看主 Hackage 页面您可能会注意到每个包都不是这两个包的最新版本。)

一般来说,transformersmtl定义了很多同名函数,只是transformers版本只对直接实现相关效果的transformer类型起作用,而mtl 使用 Monad* class 系统使它们可以自动提升到其他包裹变压器的方法。

对于直接实现的转换器,就像您的情况一样,mtl 中使用的特定方法实例通常只是引用相应的 transformer 函数。