gpt4 book ai didi

monads - 为什么验证会违反 monad 法则?

转载 作者:行者123 更新时间:2023-12-04 18:57:00 25 4
gpt4 key购买 nike

SO解释了为什么像 scalaz、cats (Scala) 或 Arrow (Kotlin) 中的 Validation 不能是 monad。

据我所知,这是因为他们已经根据应用仿函数对 monad 进行了建模,并且验证作为应用的所需行为(收集所有无效)与验证作为 monad 的所需行为不同(序列验证并在第一个无效)。因此,当您希望快速失败时,您需要将验证转换为任何一个(这是一个 monad)。

https://groups.google.com/forum/#!msg/scalaz/IWuHC0nlVws/syRUkXJklWIJ ,他们提到验证不是 monad 的原因,是因为以下属性不成立:

x <|*|> y === x >>= (a => y map ((a, _))) 

但是看看monad的定义,上面的属性不是 monad laws的一部分.那么,这是因为 monad 是根据应用程序来实现的,还是上述属性是成为 monad 的先决条件?

这种更高级的推理对我来说都是陌生的,但在我对 FP 的有限理解中,我可以有一个验证数据类型,当用作应用程序(累积无效)时具有一种行为,而用作 monad 时具有另一种行为(快速失败)。

最佳答案

你已经把所有的部分都弄对了。是的,Validation 的合法 monad 实例是可能的。问题是它会产生两个不同的 Applicative Validation 的实例: 一个累积错误,另一个来自 monad 实例并且快速失败。这将导致类型类不连贯:程序行为取决于类型类实例是如何到达的。

你提到的房产,

x <|*|> y === x >>= (a => y map ((a, _)))

可以作为 <|*|>的定义在 >>= 方面和 map ,因此对于从 Monad 派生的 Applicative 自动成立。问题是已经有一个不同的 Applicative 具有不同的行为 <|*|> .

关于monads - 为什么验证会违反 monad 法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50174323/

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