查看Control.Applicative
的文档,我注意到它们有某些monad的实例声明(例如IO
,Maybe
,尤其是ST
),但没有MTL monad的实例,例如State
和RWS
。相反,它看起来像是定义了一个通用WrappedMonad
类型,我猜测它将覆盖所有其他情况。
所以这是我的问题:
为什么没有MTL monad的Applicative
个实例?到目前为止,我自己能够找到的最佳答案是three year old post,其中有人实现了这些实例并被忽略了。
与WrappedMonad
有什么关系?我找到了一个简短解释的post on Reddit,但我觉得我对如何使用它很困惑。
最终,我希望能够在应用程序样式中使用State
(就像recommended to me一样),但是如果我必须使用WrappedMonad
数据构造函数丢弃我的代码,那么它似乎不是一场胜利。我也可以完全忽略WrappedMonad
,并以与Applicative
,IO
等相同的方式自行定义ST
实例:就{{1}而言}和return
......但这似乎也很愚蠢。
答案 0 :(得分:8)
该文档仅基于base
包的内容生成,该包不包含State
- 因此它不包含Applicative
个实例。如果您查看the MTL documentation,则会看到列出Applicative
个实例。
或者,您可以打开GHCi,导入Control.Monad.State和Control.Applicative,并使用:i Applicative
列出Applicative
或:i StateT
的实例以列出哪个StateT
有实例(State
是StateT
的类型别名,其中一个参数已修复)。要么表明确实存在这样的实例。
答案 1 :(得分:2)
mtl monads的Applicative实例无法在基础文档中列出,因为此时没有可用的mtl。好消息是mtl具有Applicative实例StateT for example,因为mtl-2.0.0.0。