Es ist in der scalaz.Traverse
Typklasse definiert, wo es wie folgt aussieht:
def sequence[G[_]:Applicative,A](fga: F[G[A]]): G[F[A]] =
traversal[G].run[G[A], A](fga)(ga => ga)
scalaz.syntax.TraverseOps
eine Version bereitstellt, die auf List
gepimpt wird, da List
eine Traverse
Instanz hat.
Sie können entweder importieren, was Sie brauchen:
import scalaz._, std.list._, std.option._, syntax.traverse._
Oder alles und die Küchenspüle:
import scalaz._, Scalaz._
Und dann können Sie es wie folgt verwendet werden:
scala> val xs: List[Option[Int]] = Some(1) :: Some(2) :: Nil
xs: List[Option[Int]] = List(Some(1), Some(2))
scala> xs.sequence
res0: Option[List[Int]] = Some(List(1, 2))
Oder wenn Sie genau die Formulierung in Ihrer Frage wünschen:
scala> def sequence[T](l: List[Option[T]]): Option[List[T]] = l.sequence
sequence: [T](l: List[Option[T]])Option[List[T]]
scala> sequence(xs)
res1: Option[List[Int]] = Some(List(1, 2))