【问题标题】:How can I make analog of Either?我怎样才能模拟Either?
【发布时间】:2015-04-22 01:20:06
【问题描述】:

编译器在 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

【问题讨论】:

  • 编译器在哪里抱怨...?请添加完整的错误日志。
  • Idea 下划线 Left(e) 并附上我在上面写的注释。编译器说 Error:(17, 10) 构造函数不能被实例化为预期的类型;找到:core.Failure[T] 需要:core.ServiceResult[E,R] case Failure(e) => Left(e) ^
  • 嗯...试试sbt compile 并添加有问题的错误日志。
  • [错误] /Users/deil/Projects/nms/src/main/scala/core/Result.scala:17:构造函数无法实例化为预期类型; [错误] 找到:core.Failure[T] [error] required: core.ServiceResult[E,R] [error] case Failure(e) => Left(e) [error] ^
  • 你正在尝试做一些非常奇怪的事情。这段代码似乎有很多问题。您能否解释一下要求...以便我们提出一些替代解决方案。

标签: scala generics covariance either


【解决方案1】:

以下内容对您有用吗?

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] {}

【讨论】:

  • 是的,这就是我需要的!谢谢)
【解决方案2】:

我认为你想要的只是,

trait ServiceError

trait ServiceResult

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

如果这不符合您的要求,请在 cmets 中告知。

【讨论】:

  • 是的,我知道我可以这样做......但根据我的问题“我怎样才能模拟 Either?”这不是一个答案)我只是对如何使这项工作变得疯狂......试图更好地理解scala,variance,类型系统。而且我不会放弃。我觉得有可能让它以我的方式工作
  • 嗯...可以做很多事情...但是现在,您的模型没有意义。我的建议是——不要急于求成,给它时间……逐步取得进展。你需要的是真正的理解,这可能需要一些时间才能得到。你在这段代码中试图做的有点类似于用兔子来创造一只松鼠,它有角,会说德语、英语和法语。
  • 好的)))))也许你是对的)非常感谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2015-10-30
  • 2014-07-05
  • 2019-07-09
  • 2016-11-02
  • 2022-11-16
相关资源
最近更新 更多