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?

Author: Community, 2013-07-02

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.

 16
Author: huitseeker,
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