Как я могу сделать аналог 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 ]
Если это не соответствует вашим требованиям, то сообщите об этом в комментариях.