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

Компилятор жалуется на Left (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.


person Deil    schedule 20.02.2015    source источник
comment
Куда компилятор жалуется ...? пожалуйста, добавьте полный журнал ошибок.   -  person sarveshseri    schedule 20.02.2015
comment
Идея подчеркивания Left (e) с пометкой, которую я написал выше. Компилятор сообщает об ошибке: (17, 10) нельзя создать экземпляр конструктора ожидаемого типа; найдено: core.Failure [T] required: core.ServiceResult [E, R] case Failure (e) = ›Left (e) ^   -  person Deil    schedule 20.02.2015
comment
Что ж ... попробуйте sbt compile и добавьте соответствующий журнал ошибок.   -  person sarveshseri    schedule 20.02.2015
comment
[ошибка] /Users/deil/Projects/nms/src/main/scala/core/Result.scala:17: нельзя создать экземпляр конструктора ожидаемого типа; [ошибка] обнаружена: core.Failure [T] [ошибка] требуется: core.ServiceResult [E, R] [ошибка] case Failure (e) = ›Left (e) [error] ^   -  person Deil    schedule 20.02.2015
comment
Вы пытаетесь делать очень странные вещи. Кажется, у этого кода много проблем. Не могли бы вы объяснить требования ... чтобы мы могли предложить какое-нибудь альтернативное решение.   -  person sarveshseri    schedule 20.02.2015
comment
Ok. У меня есть черта ServiceError. У каждой службы на бэкэнде есть свои ошибки, которые расширяют эту черту. Когда я делаю запрос, например, из уровня покоя (subnetService? GetByIdWithInfo (SubnetId (id))). MapTo [ServiceResult [SubnetServiceError, SubnetWithInfoDTO]]) я хочу иметь тип типа Either [A, B], но с некоторыми дополнительными ограничениями . В случае ошибки или ошибок на сервере - вернуть List [ServiceError], в противном случае - вернуть какой-то результат.   -  person Deil    schedule 20.02.2015
comment
Я думаю, что вы, вероятно, хотите просто type ServiceResult[ R ] = Either[ List[ ServiceError ], R ].   -  person sarveshseri    schedule 20.02.2015


Ответы (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] {}
person Andreas Flueckiger    schedule 23.02.2015
comment
Да вот что мне нужно! Спасибо) - person Deil; 26.02.2015

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

trait ServiceError

trait ServiceResult

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

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

person sarveshseri    schedule 20.02.2015
comment
Да, я знаю, что могу сделать именно так .... но, судя по моему вопросу, как я могу сделать аналог Either? это не ответ) Я просто схожу с ума по поводу того, как заставить эту работу ... пытаясь лучше понять scala, дисперсию, систему типов. И я не хочу сдаваться. Мне кажется, что можно заставить это работать на моем пути - person Deil; 20.02.2015
comment
Что ж ... можно много чего делать ... но в настоящее время ваша модель не имеет смысла. Мое предложение - не торопитесь и дайте ему время ... добиваться постепенного прогресса. Вам нужно настоящее понимание, и на это может потребоваться время. То, что вы пытаетесь сделать в этом коде, похоже на использование кроликов для создания белки с рогами, которая может говорить на немецком, английском и французском языках. - person sarveshseri; 20.02.2015
comment
Ладно))))) Может ты и прав) В любом случае спасибо большое. - person Deil; 20.02.2015