monad - Nuevo comportamiento de desugaring en Scala 2.10.1
for scala (1)
La historia es más compleja que eso, y de hecho es una regresión 2.10.0 que se conectó allí.
El comportamiento "no- withFilter
" se introdujo en c82ecab , y debido a cosas como SI-6968 , se revirtió parcialmente #1893 . Siguieron otras adaptaciones ( SI-6646 , SI-7183 )
La frase para llevar que estás buscando es:
El analizador no puede suponer que un patrón (a, b) coincidirá, ya que los resultados de .isInstanceOf [Tuple2] no se pueden conocer de forma estática hasta después del tipificador.
Supongamos que tengo esta clase monádica:
case class Foo[A](xs: List[A]) {
def map[B](f: A => B) = Foo(xs map f)
def flatMap[B](f: A => Foo[B]) = Foo(xs flatMap f.andThen(_.xs))
def withFilter(p: A => Boolean) = {
println("Filtering!")
Foo(xs filter p)
}
}
Lo siguiente es de una sesión REPL 2.10.0:
scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
res0: Foo[Int] = Foo(List(1))
Y aquí está la misma cosa en 2.10.1:
scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
Filtering!
res0: Foo[Int] = Foo(List(1))
Esto es completamente inesperado (para mí), y conduce a errores particularmente confusos en los casos en que el filtrado requiere restricciones adicionales (como Scalaz''s //
o EitherT
).
No pude encontrar ninguna discusión sobre este cambio en las notas de la versión 2.10.1 . ¿Alguien puede señalar dónde y por qué se introdujo este nuevo comportamiento de desugaring?