【问题标题】:Applicative instance for State and other MTL monads?State 和其他 MTL monad 的应用实例?
【发布时间】:2011-11-03 00:34:33
【问题描述】:

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

所以这是我的问题:

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

  2. WrappedMonad 是怎么回事?我找到了一个 post on Reddit 简要解释了它,但我想我对如何使用它感到困惑。

最终我希望能够以应用风格使用State(就像recommended to me 一样),但如果我不得不用WrappedMonad 数据构造函数乱扔我的代码,那么它看起来不像是赢。我也可以完全忽略WrappedMonad,并以与IOST 等相同的方式自己定义Applicative 实例:就returnap 而言...看起来也很傻。

【问题讨论】:

  • 如果我们有 Functor => Applicative => Monad 和 (Alternative, Monad) => MonadPlus

标签: haskell state-monad applicative


【解决方案1】:

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

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

【讨论】:

  • 显然我是个盲人。我正在查看那个确切的文档,但没有看到 Applicative 实例。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多