Comment aplatir la liste des options à l'aide des fonctions d'ordre supérieur?

Utilisation De Scala 2.7.7:

Si j'ai une liste d'Options, je peux les aplatir à l'aide d'un pour-de la compréhension:

val listOfOptions = List(None, Some("hi"), None)
listOfOptions: List[Option[java.lang.String]] = List(None, Some(hi), None)

scala> for (opt <- listOfOptions; string <- opt) yield string
res0: List[java.lang.String] = List(hi)

Je n'aime pas ce style, et préfère utiliser un HOF. Cette tentative est trop détaillé pour être acceptable:

scala> listOfOptions.flatMap(opt => if (opt.isDefined) Some(opt.get) else None)
res1: List[java.lang.String] = List(hi)

Intuitivement je me serais attendu à la suite de travailler, mais il n'a pas d':

scala> List.flatten(listOfOptions)
<console>:6: error: type mismatch;
 found   : List[Option[java.lang.String]]
 required: List[List[?]]
       List.flatten(listOfOptions)

Même les éléments suivants qui semble comme il devrait fonctionner, mais n'a pas:

scala> listOfOptions.flatMap(_: Option[String])
<console>:6: error: type mismatch;
 found   : Option[String]
 required: (Option[java.lang.String]) => Iterable[?]
       listOfOptions.flatMap(_: Option[String])
                          ^

Du mieux que je peux venir avec est:

scala> listOfOptions.flatMap(_.toList)         
res2: List[java.lang.String] = List(hi)

... mais je préférerais ne pas avoir à convertir l'option d'une liste. Qui semble maladroit.

Des conseils?

InformationsquelleAutor Synesso | 2010-05-24