【发布时间】:2018-12-07 10:49:17
【问题描述】:
我想实现一个与Either 类型类似的类型,称为Result。主要区别在于,Result 类型的左侧应该始终是某物的列表。什么是正确的类型定义?我尝试过这样的事情:
sealed trait Result[List, +A] {
def map[B](f: A => B): Result[List, B] = this match {
case Failure(err) => Failure(err)
case Success(value) => Success(f(value))
}
def apply[B](f: Result[List, A => B]): Result[List, B] = (f, this) match {
case (Failure(fE), Failure(aE)) => Failure(fE ::: aE)
case ...
}
}
final case class Failure[+E](errors: List[E]) extends Result[List[E], Nothing]
final case class Success[+A](value: A) extends Result[Nothing, A]
但这会在映射函数中出现错误,即 Failure[Any] does not equal Result[List, B] 和 Success[B] does not equal Result[List, B]。类型定义 Result[List, +A] 是否已经错误,我应该改用 List[_] 之类的更高种类的类型吗?
【问题讨论】:
标签: scala types either higher-kinded-types