一个使用案例的例子:
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
所分类。
我猜测这个错误是由于编译器找不到Validation[String, Int]
的Monad
实例导致的。
我可以自己制作一个,例如:
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
没有它已经定义了bind
方法的这个功能呢?此外,我不能再同时拥有
import Validation._
和import Instances._
(这让我花了很长时间才找到...),因为另一个复杂的错误...存在歧义的隐式值:例如,我的实例validationMonad
和特质ValidationInstances2
中的方法ValidationInstances1
都匹配Functor of Validation
...我应该修改scalaz的源代码吗?还是我完全错过了什么?
请帮帮我,我使用的是scalaz 7.0.0-M2。
scalaz.\/
(Scalaz 中替代Either
的右偏向类型)它具有您所需的语义,因此对其他人来说可能更容易理解。(实现一条基本上违反了单子律和应用律的规则可能完全运作良好且可预测,但仍可能会有些混淆。) - Debilski