28

一个示例用例:

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._
validationMonadValidationInstances1ValidationInstances2Functor of Validation

我应该修改scalaz的来源吗?或者我完全错过了什么~?
请帮忙~

我正在使用 scalaz 7.0.0-M2

4

2 回答 2

22

正如Scalaz 小组中所讨论的,问题似乎是ap会累积错误,而(伪)单子组合只会对Validation.

因此,一个不能用另一个表示,因此不存在 monad 实例Validation

于 2012-08-31T09:12:32.160 回答
6

问题是单子所暗示的应用函子不等于实际的应用函子

于 2012-08-31T10:00:31.290 回答