Scala 与列表
Scala Either with List
我想实现一个名为 Result
的类似于 Either
类型的类型。主要区别在于,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[_]
这样更高级的类型吗?
如果您希望左侧总是List
,则无需抽象List
。 E
摘要:
sealed trait Result[+E, +A] {
def map[B](f: A => B): Result[E, B] = this match {
case Failure(err) => Failure(err)
case Success(value) => Success(f(value))
}
def apply[B, F >: E](f: Result[F, A => B]): Result[F, B] = (f, this) match {
case (Failure(fE), Failure(aE)) => Failure(fE ::: aE)
case (Failure(fE), _) => Failure(fE)
case (_, Failure(aE)) => Failure(aE)
case (Success(fS), Success(tS)) => Success(fS(tS))
}
}
case class Failure[+E](errors: List[E]) extends Result[E, Nothing]
case class Success[+A](value: A) extends Result[Nothing, A]
请注意,您似乎正在重新发明 Scalaz/Cats 中的一些标准 Applicative
。
我想实现一个名为 Result
的类似于 Either
类型的类型。主要区别在于,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[_]
这样更高级的类型吗?
如果您希望左侧总是List
,则无需抽象List
。 E
摘要:
sealed trait Result[+E, +A] {
def map[B](f: A => B): Result[E, B] = this match {
case Failure(err) => Failure(err)
case Success(value) => Success(f(value))
}
def apply[B, F >: E](f: Result[F, A => B]): Result[F, B] = (f, this) match {
case (Failure(fE), Failure(aE)) => Failure(fE ::: aE)
case (Failure(fE), _) => Failure(fE)
case (_, Failure(aE)) => Failure(aE)
case (Success(fS), Success(tS)) => Success(fS(tS))
}
}
case class Failure[+E](errors: List[E]) extends Result[E, Nothing]
case class Success[+A](value: A) extends Result[Nothing, A]
请注意,您似乎正在重新发明 Scalaz/Cats 中的一些标准 Applicative
。