Nuevo comportamiento de desugaring en Scala 2.10.1
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á lo mismo 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 el de Scalaz \/
o EitherT
).
No pude encontrar ninguna discusión sobre este cambio en las notas de la versión 2.10.1. ¿Puede alguien señalar dónde ¿y por qué se introdujo este nuevo comportamiento de desugaring?
1 answers
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 , esto se revirtió parcialmente #1893. Otras adaptaciones seguido (SI-6646, SI-7183)
La frase para llevar que estás buscando es:
El analizador no puede asumir que un patrón (a, b) coincidirá, como resultado de .isInstanceOf [Tuple2] no se puede conocer estáticamente hasta después de la typer.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-02 13:35:45