what monad for comprehension scala syntax filtering monads for-comprehension

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?