State和其他MTL monad的应用实例?

时间:2011-11-03 00:34:33

标签: haskell state-monad applicative

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

所以这是我的问题:

  1. 为什么没有MTL monad的Applicative个实例?到目前为止,我自己能够找到的最佳答案是three year old post,其中有人实现了这些实例并被忽略了。

  2. WrappedMonad有什么关系?我找到了一个简短解释的post on Reddit,但我觉得我对如何使用它很困惑。

  3. 最终,我希望能够在应用程序样式中使用State(就像recommended to me一样),但是如果我必须使用WrappedMonad数据构造函数丢弃我的代码,那么它似乎不是一场胜利。我也可以完全忽略WrappedMonad,并以与ApplicativeIO等相同的方式自行定义ST实例:就{{1}而言}和return ......但这似乎也很愚蠢。

2 个答案:

答案 0 :(得分:8)

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

或者,您可以打开GHCi,导入Control.Monad.State和Control.Applicative,并使用:i Applicative列出Applicative:i StateT的实例以列出哪个StateT有实例(StateStateT的类型别名,其中一个参数已修复)。要么表明确实存在这样的实例。

答案 1 :(得分:2)

mtl monads的Applicative实例无法在基础文档中列出,因为此时没有可用的mtl。好消息是mtl具有Applicative实例StateT for example,因为mtl-2.0.0.0。