Как я могу сделать аналог Either?

Компилятор жалуется слева (e): выражение типа Left(List[ServiceError, Nothing]) не соответствует ожидаемому типу Either[E, R]

sealed trait ServiceResult[+E <: List[ServiceError], +R ] {
      def toEither: Either[E , R] = this match {
        case Success(a) => Right(a)
        case Failure(e) => **Left(e)**
      }
    }

    final case class Success[+R](a: R) extends ServiceResult[Nothing, R] {}

    final case class Failure[+T <: ServiceError](e: List[T]) extends ServiceResult[List[T], Nothing]{}

Мое требование объяснено ниже,

Итак... У меня есть черта ServiceError, У каждого Сервиса есть свои ошибки, которые расширяют эту черту. Когда я делаю запрос, например, из слоя отдыха,

val r = subnetService ? GetByIdWithInfo( SubnetId( id ) )
val r2 = r.mapTo[ ServiceResult [ SubnetServiceError, SubnetWithInfoDTO ] ] )

Я хочу иметь тип, подобный Either[A,B], но с некоторыми дополнительными ограничениями. В случае ошибки (или ошибок) на сервере - вернуть List[ServiceError] или верните немного result,

2 ответа

Решение

Работает ли у вас следующее?

sealed trait ServiceResult[+E <: ServiceError, +R] {
  def toEither: Either[List[E], R] = this match {
    case Success(a) => Right(a)
    case Failure(e) => Left(e)
  }
}

final case class Success[+R](a: R) extends ServiceResult[Nothing, R] {}

final case class Failure[+T <: ServiceError](e: List[T]) extends ServiceResult[T, Nothing] {}

Я думаю, что вы хотите просто

trait ServiceError

trait ServiceResult

type ServiceEither = Either[ List[ ServiceError ], ServiceResult ]

Если это не соответствует вашим требованиям, то сообщите об этом в комментариях.

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