dlaczego Walidacja nie jest Monadą? (scalaz7)
przykładowy przypadek użycia:
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
błąd: Nie można anulować wpisaniascalaz.Validation[String,Int]
w konstruktor rodzajuM[_]
to jest klasyfikowane przez klasę typuscalaz.Bind
I odgadnąć błąd jest spowodowany przez kompilator nie może znaleźćMonad
przykładValidation[String, Int]
Mogę zrobić to dla siebie, jak:
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
}
}
ale dlaczego nieValidation
już to masz? po wszystkim,Validation
już mabind
zdefiniowana metoda.
zresztą nie mogęimport Validation._
iimport Instances._
już razem (to zajęło mi trochę czasu, żeby się dowiedzieć ...), z powodu innegoskomplikowane błąd...
niejednoznaczne wartości ukryte: coś w tym styluvalidationMonad
(moja instancja) i metodaValidationInstances1
w cechyValidationInstances2
... oba pasują do niektórychFunctor of Validation
...
powinienem zmodyfikować źródło skalazu? albo zupełnie czegoś mi brakuje ~?
proszę o pomoc ~
Używam scalaz 7.0.0-M2