monads – 为什么验证会违反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与< | * |>的不同行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |