我怎样才能模拟Either?
How can I make analog of 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] 这样的类型,但有一些额外的限制。如果服务器出现错误(或错误) - return List[ServiceError]
或 return 某些 result
.
我想你想要的只是,
trait ServiceError
trait ServiceResult
type ServiceEither = Either[ List[ ServiceError ], ServiceResult ]
如果这不符合您的要求,请在评论中指出。
以下对你有用吗?
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] {}
编译器在 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] 这样的类型,但有一些额外的限制。如果服务器出现错误(或错误) - return List[ServiceError]
或 return 某些 result
.
我想你想要的只是,
trait ServiceError
trait ServiceResult
type ServiceEither = Either[ List[ ServiceError ], ServiceResult ]
如果这不符合您的要求,请在评论中指出。
以下对你有用吗?
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] {}