gpt4 book ai didi

haskell - 为什么 AccValidation 不能有 Monad 实例?

转载 作者:行者123 更新时间:2023-12-03 10:54:36 25 4
gpt4 key购买 nike

来自 validation 的文档包裹:

The AccValidation data type is isomorphic to Either, but has an instance of Applicative that accumulates on the error side. That is to say, if two (or more) errors are encountered, they are appended using a Semigroup operation.

As a consequence of this Applicative instance, there is no corresponding Bind or Monad instance. AccValidation is an example of, "An applicative functor that is not a monad."


我不清楚为什么这是一个结果。我可以想象一个 Monad AccValidation 的实例行为类似于 Either - 什么会使这不合法?

最佳答案

The (<*>) = ap exigence可以用 (>>=) 来明确说明:

u <*> v = u >>= \f -> fmap f v -- [1]

现在,给定 FunctorApplicative AccValidation 的实例, 我们有:
fmap _ (AccFailure e) = AccFailure e -- [2]

AccFailure e1 <*> AccFailure e2 = AccFailure (e1 <> e2) -- [3]

如果我们制作 u = AccFailure e1v = AccFailure e2在 [1] 中,我们得到:
AccFailure e1 <*> AccFailure e2 = AccFailure e1 >>= \f -> fmap f (AccFailure e2)

代入 [2] 和 [3] 导致我们:
AccFailure (e1 <> e2) = AccFailure e1 >>= \_ -> AccFailure e2 -- [4]

问题是不可能写出 (>>=)使得 [4] 成立。左侧取决于 e2右侧的值必须来自应用 \_ -> AccFailure e2 :: Semigroup e => a -> AccValidation e b .但是,它没有可以应用的东西——尤其是 e1。类型错误。 (有关这一点的进一步讨论,请参阅 Cactus 答案的最后两段。)因此,无法给出 AccValidation一个 Monad与其 Applicative一致的实例一。

关于haskell - 为什么 AccValidation 不能有 Monad 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40539650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com