加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

monads – 为什么验证会违反monad法律?

发布时间:2020-12-16 18:14:48 所属栏目:安全 来源:网络整理
导读:在 SO,给出了一个解释,为什么像scalaz,猫(Scala)或Arrow(Kotlin)中的验证不能成为monad. 据我所知,这是因为他们已经根据应用函子和所需的验证行为对monad进行建模,因为应用程序(收集所有残留物)与作为monad的验证的所需行为不同(序列验证并快速失败)第一个无
在 SO,给出了一个解释,为什么像scalaz,猫(Scala)或Arrow(Kotlin)中的验证不能成为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的理解有限,我可以使用一种验证数据类型,当用作应用程序(累积invalids)时有一种行为,当用作mo??nad时有另一种行为(快速失败).

解决方法

你已经把所有的东西都搞定了.是的,可以使用合法的monad实例进行验证.问题是它将为验证产生两个不同的Applicative实例:一个累积错误,另一个从monad实例派生并快速失败.这将导致类型类不一致:程序行为取决于类型类实例的到达方式.

你提到的财产,

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读