2012-09-04 7 views
17

Ich lerne Scalaz und ich habe ein Projekt, das bereits Scalaz7 verwendet. Nach this question würde Ich mag die FunktionWo ist "Sequenz" in Scalaz7

sequence[T](l: List[Option[T]]): Option[List[T]] 

verwenden (nicht, dass es schwer ist, es selbst zu schreiben). Aber die oben erwähnte Frage erwähnt Scalaz6.

Wo finde ich die Sequenzfunktion in Scalaz7?

Antwort

27

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))