Scala либо со списком

Я хотел реализовать аналогичный тип с именем Result для типа Either. Основное отличие состоит в том, что левая сторона типа Result всегда должна быть списком чего-то. Какое определение типа было бы правильным для этого? Я пробовал иметь что-то вроде этого:

sealed trait Result[List, +A] {
    def map[B](f: A => B): Result[List, B] = this match {
        case Failure(err) => Failure(err)
        case Success(value) => Success(f(value))
    }
    def apply[B](f: Result[List, A => B]): Result[List, B] = (f, this) match {
        case (Failure(fE), Failure(aE)) => Failure(fE ::: aE)
        case ...
    }
}

final case class Failure[+E](errors: List[E]) extends Result[List[E], Nothing]
final case class Success[+A](value: A) extends Result[Nothing, A]

Но это работает с ошибкой в ​​функции карты, говорящей Failure[Any] does not equal Result[List, B] и Success[B] does not equal Result[List, B]. Является ли определение типа Result[List, +A] уже неправильным, должен ли я вместо этого использовать тип более высокого типа, такой как List[_]?


person Lando-L    schedule 28.06.2018    source источник


Ответы (1)


Если вы хотите, чтобы левая сторона была всегда List чего-то, тогда нет необходимости абстрагироваться от List. Резюме над E:

sealed trait Result[+E, +A] {
    def map[B](f: A => B): Result[E, B] = this match {
        case Failure(err) => Failure(err)
        case Success(value) => Success(f(value))
    }
    def apply[B, F >: E](f: Result[F, A => B]): Result[F, B] = (f, this) match {
        case (Failure(fE), Failure(aE)) => Failure(fE ::: aE)
        case (Failure(fE), _) => Failure(fE)
        case (_, Failure(aE)) => Failure(aE)
        case (Success(fS), Success(tS)) => Success(fS(tS))
    }
}

case class Failure[+E](errors: List[E]) extends Result[E, Nothing]
case class Success[+A](value: A) extends Result[Nothing, A]

Обратите внимание, что это выглядит так, как будто вы заново изобретаете некоторые стандартные Applicative из Scalaz/Cats.

person Andrey Tyukin    schedule 28.06.2018
comment
Я по-прежнему получаю ту же ошибку, говоря, что Failure[Any] не равно Railway[E,B], и мне нужны свойства списка, если я хочу реализовать какую-то функцию применения. Я обновлю свой вопрос, чтобы объяснить это - person Lando-L; 28.06.2018
comment
@ Lando-L приведенный выше код определенно компилируется. Я обновил часть apply. Я предполагаю, что вы сделали что-то не так с аннотациями дисперсии. - person Andrey Tyukin; 28.06.2018
comment
Я не знаю, что я сделал не так, я думал, что у меня точно такой же код. Спасибо! - person Lando-L; 28.06.2018
comment
@ Ландо-L Я предполагаю, что где-то отсутствовал + перед List. Это работает сейчас? - person Andrey Tyukin; 28.06.2018