为什么没有验证一个单子? (scalaz7)(why isn't Validation

2019-06-27 15:30发布

一个例子用例:

def div2(i: Int): Validation[String, Int] = 
    if (i%2 == 0) Validation.success(i/2)
    else Validation.failure("odd")

def div4(i: Int) = for {
    a <- div2(i)
    b <- div2(a)
} yield b

错误 :无法取消应用类型scalaz.Validation[String,Int]成种类型构造M[_]其由类型分类类scalaz.Bind

的错误是由编译器造成无法找到一个Monad例如Validation[String, Int]

我可以做一个为自己,如:

object Instances {
implicit def validationMonad[E] = new Monad[({type L[A] = Validation[E, A]})#L] {
    override def point[A](a: => A) =
        Validation.success(a)
    override def bind[A, B](fa: Validation[E, A])(f: A => Validation[E, B]) =
        fa bind f
}
}

但为什么没有Validation拥有它了吗? 毕竟, Validation已经具有bind定义的方法。

此外,我不能有import Validation._import Instances._在一起了(这花了我looong找出...),因为另一个复杂的 错误 ...
暧昧的隐性价值:像这两个validationMonad (我的实例),和方法ValidationInstances1的特质ValidationInstances2 ......都匹配了一些Functor of Validation ...

我应该修改scalaz的来源是什么? 或者我完全失去了一些东西〜?
请帮助〜

我使用scalaz 7.0.0-M2

Answer 1:

正如所讨论的Scalaz组中,这个问题似乎是, ap会积累误差,而(伪)一元组合物将只对的值部分操作Validation

因此,人们不能在其他方面的表现,因此没有单子实例存在的Validation



Answer 2:

问题是,作为暗示的单子的适用函子不等于实际适用函子



文章来源: why isn't Validation a Monad? (scalaz7)