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

я должен изменить источник скаляза? или я чего-то совершенно упускаю ~?
пожалуйста, помогите ~

Я использую скалаз 7.0.0-M2

2 ответа

Решение

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

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

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

Другие вопросы по тегам