示例使用案例:
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
]分类
I 猜测
错误是由编译器找不到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._
放在一起(这使我无所适从...)。不明确的隐式值:类似validationMonad
(我的实例)和特征ValidationInstances1
中的方法ValidationInstances2
都匹配某些Functor of Validation
...我应该修改scalaz的来源吗?还是我完全错过了什么〜?请帮忙〜
我正在使用scalaz 7.0.0-M2
示例使用案例:def div2(i:Int):Validation [String,Int] = if(i%2 == 0)Validation.success(i / 2)else Validation.failure(“ odd”)def div4 (i:Int)=对于{a
作为Scalaz组中的discussed,问题似乎在于ap
会积累错误,而(伪)单原子成分将仅对Validation
的值部分起作用。
因此,一个不能用另一个来表示,因此Validation
不存在monad实例。
问题在于,单子暗示的应用函子不等于actual