この操作はシーケンシングと呼ばれることが多く、一部の関数型言語(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
クラスも提供しますが、sのリストで使用すると、最初で停止するのではなく、複数のエラーが収集されます。Either
sequence
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