一个示例用例:
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
error: 无法取消应用类型scalaz.Validation[String,Int]
进入类型构造函数M[_]
按类型类别分类scalaz.Bind
I guess该错误是由于编译器找不到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._
and import Instances._
不再在一起了(这花了我很长时间才弄清楚......),因为另一个复杂的 error...
模糊的隐含值:两者类似validationMonad
(我的实例)和方法ValidationInstances1
特质中ValidationInstances2
...都匹配一些Functor of Validation
...
我应该修改scalaz的源吗?或者我完全错过了一些东西〜?
请帮忙~
我正在使用 scalaz 7.0.0-M2