为什么不验证Monad? (scalaz7)

时间:2012-08-31 08:40:50

标签: scala monads scalaz scalaz7

示例用例:

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._放在一起了(这让我想出来......),因为另一个复杂 错误 ...
含糊不清的隐含值:类似validationMonad(我的实例)和特征ValidationInstances1中的方法ValidationInstances2 ......都匹配某些Functor of Validation ......

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

我正在使用scalaz 7.0.0-M2

2 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:6)

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