Подтвердить что ты не робот

Почему не Валидация Монады? (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

4b9b3361

Ответ 1

Поскольку обсуждается в группе Scalaz, проблема заключается в том, что ap будет накапливать ошибки, тогда как (псевдо) монадическая композиция будет только работать с частью значения Validation.

Следовательно, нельзя выразить в терминах другого, и, таким образом, экземпляр monad не существует для Validation.

Ответ 2

Проблема заключается в том, что аппликативный функтор, подразумеваемый монадой, не равен фактическому аппликативному функтору