[英]Applicative instance for State and other MTL monads?
查看Control.Applicative
的文档,我注意到它们具有某些monad的实例声明(例如IO
, Maybe
,尤其是ST
),但是没有MTL monad的实例,例如State
和RWS
。 相反,它看起来像是定义了一个通用的WrappedMonad
类型,我猜这是为了涵盖所有其他情况。
所以这是我的问题:
为什么不存在MTL monad的Applicative
实例? 到目前为止,我自己能够找到的最好的答案是一个三年前的帖子 ,有人实现了这些实例,并被忽略了。
最终我希望能够以一种应用风格使用State
(正如我所推荐的那样),但是如果我必须使用WrappedMonad
数据构造函数WrappedMonad
我的代码,那么它似乎不是一个胜利。 我也可以完全忽略WrappedMonad
,并以与IO
, ST
等相同的方式自己定义Applicative
实例:就return
和ap
......但这似乎也很傻。
该文档仅基于base
包的内容生成,该包不包含State
- 因此它不包含Applicative
实例。 如果您查看MTL文档 ,您将看到列出的Applicative
实例。
或者,你可以打开GHCI,进口Control.Monad.State和Control.Applicative和使用:i Applicative
列出的实例Applicative
或:i StateT
列出了该类别StateT
有实例( State
是一个类型别名StateT
,其中一个参数已修复)。 要么表明确实存在这样的实例。
mtl monad的Applicative实例不能在基础文档中列出,因为此时没有可用的mtl。 好消息是,mtl具有应用实例StateT,例如 mtl-2.0.0.0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.