28

ユースケースの例:

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

エラーの原因は、コンパイラがインスタンスを見つけられなかったためだと思います。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._ん(これは私が理解するのに時間がかかりました...)... あいまいな暗黙の値:両方のようなもの(私のインスタンス)と特性のメソッド...両方ともいくつか一致します...
validationMonadValidationInstances1ValidationInstances2Functor of Validation

scalazのソースを変更する必要がありますか?または私は完全に何かが欠けています〜?
助けてください〜

scalaz7.0.0-M2を使用しています

4

2 に答える 2

22

Scalazグループで議論さapれているように、(疑似) モナド合成は の値の部分でのみ動作するのに対し、問題はエラーを蓄積することであると思われますValidation

したがって、一方を他方で表現することはできず、したがって のモナドインスタンスは存在しませんValidation

于 2012-08-31T09:12:32.160 に答える
6

問題は、モナドによって暗示されたアプリケーション ファンクターが実際のアプリケーション ファンクターと等しくないことです。

于 2012-08-31T10:00:31.290 に答える