为什么不验证Monad?

问题描述 投票:27回答:2

示例使用案例:

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 猜测

错误是由编译器找不到MonadValidation[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

scala monads scalaz scalaz7
2个回答
21
投票

作为Scalaz组中的discussed,问题似乎在于ap会积累错误,而(伪)单原子成分将仅对Validation的值部分起作用。

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


6
投票

问题在于,单子暗示的应用函子不等于actual

© www.soinside.com 2019 - 2024. All rights reserved.