此操作通常称为排序,并且在某些函数式语言(例如 Haskell)的标准库中可用。在 Scala 中,您可以实现自己的,也可以使用像Scalaz这样的外部库。假设我们有以下内容,例如:
val xs: List[Either[String, Int]] = List(Right(1), Right(2))
val ys: List[Either[String, Int]] = List(Right(1), Left("1st!"), Left("2nd!"))
现在我们可以编写(使用 Scalaz 7):
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._
scala> xs.sequenceU
res0: Either[String,List[Int]] = Right(List(1, 2))
scala> ys.sequenceU
res1: Either[String,List[Int]] = Left(1st!)
如预期的。
作为旁注,此操作只要求外部容器是可遍历的,并且内部容器是应用函子。Scalaz 还提供了ValidationNEL
一个很像Either
并且也符合这些要求的类,但是在 ssequence
列表上使用会ValidationNEL
收集多个错误,而不是在第一个停止:
val zs: List[ValidationNEL[String, Int]] =
List(1.successNel, "1st".failNel, "2nd".failNel)
现在我们得到:
scala> print(zs.sequenceU)
Failure(NonEmptyList(1st, 2nd))
您还可以在s、s 等sequence
列表中使用。Option
Promise