10 votes

Différence dans l'aplatissement d'une Option[List[Int]] dans 2.9.1 et 2.10 nightly

J'obtiens un comportement différent dans les versions 2.9.1 et 2.10 nightly - qu'est-ce qui a changé ?

Welcome to Scala version 2.9.1.final (OpenJDK Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> Some(3) map (x => List(x, -x)) flatten
res0: List[Int] = List(3, -3)

Versus :

Welcome to Scala version 2.10.0.r26084-b20111129020255 (OpenJDK Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> Some(3) map (x => List(x, -x)) flatten
<console>:8: error: Cannot prove that List[Int] <:< Option[B].
              Some(3) map (x => List(x, -x)) flatten

16voto

Iulian Dragos Points 3298

La raison en est qu'Option a acquis une flatten dans la version 2.10, qui ne fonctionne que sur les Option s.

Dans la version 2.9, l'appel à l'aplatissement a été ajouté par une conversion implicite en Iterable et le résultat a été un Iterable (ou un sous-type de celui-ci, en fonction de la valeur imbriquée à l'intérieur de Option ).

Voici la signature de flatten en 2.10 :

def flatten[B](implicit ev: <:<[A, Option[B]): Option[B]

Elle dit : si vous pouvez trouver des preuves que l'élément à l'intérieur de cette option est un Option lui-même, disons Option[B] je peux l'aplatir et renvoyer un Option[B] .

Les implants ne sont essayés que s'il y a non avec ce nom, ce qui explique pourquoi il ne revient pas à la méthode de la version 2.9.

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