6

查看 的文档Control.Applicative,我注意到它们具有某些 monad 的实例声明(例如IOMaybe尤其是ST),但没有 MTL monad 的实例,例如Stateand RWS。相反,它看起来像定义了一个通用WrappedMonad类型,我猜它是为了涵盖所有其他情况。

所以这是我的问题:

  1. 为什么没有ApplicativeMTL monad 的实例?到目前为止,我自己能找到的最佳答案是一个三年前的帖子,其中有人实施了这些实例,但被立即忽略了。

  2. 有什么关系WrappedMonad?我在 Reddit 上找到了一篇简要解释它的帖子,但我想我对如何使用它感到困惑。

最终,我希望能够以State应用风格使用(正如向我推荐的那样),但如果我不得不用WrappedMonad数据构造函数乱扔代码,那么这似乎不是一场胜利。我也可以完全忽略,并以与 相同的方式自己WrappedMonad定义实例,依此类推:就and ... 而言,但这似乎也很愚蠢。ApplicativeIOSTreturnap

4

2 回答 2

8

该文档仅基于包的内容生成,该base包不包含State- 因此它不包含Applicative它的实例。如果您查看MTL 文档,您将看到Applicative列出的实例。

或者,您可以打开 GHCi,导入 Control.Monad.State 和 Control.Applicative,并使用:i Applicative列出实例Applicative:i StateT列出StateT具有实例的类(是其参数之一固定State的类型别名)。StateT两者都将表明确实存在这种情况。

于 2011-11-03T00:54:09.613 回答
2

mtl monad 的 Applicative 实例无法在基本文档中列出,因为此时没有可用的 mtl。好消息是,自 mtl-2.0.0.0 以来,mtl 就有 Applicative 实例StateT 。

于 2011-11-03T00:56:45.290 回答