首页 文章

为什么不验证Monad? (scalaz7)

提问于
浏览
23

一个用例示例:

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 :无法取消应用_C4879_类型为类型 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._ (这让我想出来......),因为另一个复杂的 error ......
模糊的隐含值:像 validationMonad (我的实例)和trait ValidationInstances2 中的方法 ValidationInstances1 ...都匹配一些 Functor of Validation ...

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

我正在使用scalaz 7.0.0-M2

2 回答

  • 5

    作为Scalaz组中的discussed,问题似乎是 ap 会累积错误,而(伪)monadic组合只会对 Validation 的值部分进行操作 .

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

  • 18

    问题是monad暗示的applicative functor与实际的applicative functor不相等

相关问题