1

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

它是关于ReaderT。根据合同的要求,我正在寻找askand的实现。localMonadReader

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.ask也找不到任何ReaderT.local地方。

这是我第一次通过阅读 Hackage 发现没有实现。

我错过了什么吗?

4

1 回答 1

1

该文件包含导入语句

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

等等,从包中ReaderT.ask引用那个模块transformers-0.3.0.0(唯一列出的依赖项mtl-2.1.2。如果你查看每个包的主 Hackage 页面,你可能会注意到这些不是任何一个包的最新版本。)

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

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

于 2015-07-15T17:48:03.817 回答