75 votes

Est-il scala fonction identité?

Si j'ai quelque chose comme un List[Option[A]] et je veux le convertir en un List[A], la norme est d'utiliser flatMap:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

Maintenant, o => o est juste une fonction d'identification. J'aurais pensé qu'il y aurait d'une certaine façon de faire:

l.flatMap(Identity) //return a List[String]

Cependant, je ne peux pas obtenir que cela fonctionne comme vous ne pouvez pas generify un object. J'ai essayé quelques petites choses en vain; quiconque a quelque chose comme cela fonctionne?

72voto

Thomas Jung Points 17692

Il y a une identité de fonction dans Predef.

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

Un pour l'expresion est plus agréable, je suppose:

for(x <- l; y <- x) yield y

Edit:

J'ai essayé de comprendre pourquoi le paramètre de type (Option[String]) est nécessaire. Le problème semble être le type de conversion à partir de l'Option[T] pour Itératif[T].

Si vous définissez la fonction identité en tant que:

l.flatMap( x => Option.option2Iterable(identity(x)))

le type de paramètre peut être omis.

24voto

Daniel C. Sobral Points 159554

FWIW, sur Scala 2.8 vous appelez flatten sur il. Thomas a principalement couvert pour Scala 2.7. Il a seulement manqué un autre moyen d'utiliser cette identité:

l.flatMap[String](identity)

Il ne fonctionnera pas avec l'opérateur de notation, mais (il semble opérateur de notation n'accepte pas les paramètres de type, ce qui est bon à savoir).

Vous pouvez également appeler flatten sur Scala 2.7 (sur un List, au moins), mais il ne sera pas en mesure de faire quoi que ce soit sans un type. Toutefois, cela fonctionne:

l.flatten[String]

4voto

David Winslow Points 5224

Vous pouvez simplement donner le type inferencer un peu d'aide:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatten[String]
res0: List[String] = List(Hello, World)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X