Подтвердить что ты не робот

Новое поведение обессеривания в Scala 2.10.1

Предположим, что у меня есть этот монадический класс:

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)
  }
}

Ниже приведен пример сеанса 2.10.0 REPL:

scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
res0: Foo[Int] = Foo(List(1))

И вот то же самое в 2.10.1:

scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
Filtering!
res0: Foo[Int] = Foo(List(1))

Это совершенно неожиданно (для меня) и приводит к особенно запутывающим ошибкам в случаях, когда для фильтрации требуется дополнительные ограничения (такие как Scalaz \/ или EitherT).

Мне не удалось найти какое-либо обсуждение этого изменения в примечания к выпуску 2.10.1. Может ли кто-нибудь указать, где и почему было введено это новое десурагирующее поведение?

4b9b3361

Ответ 1

История более сложная, чем эта, и это фактически регрессия 2.10.0, которая была там подключена.

Поведение "no- withFilter" было введено в c82ecab и из-за таких вещей, как SI-6968, это было частично отменено # 1893. Последовали дальнейшие адаптации (SI-6646, SI-7183)

Выбранное предложение, которое вы ищете, это:

Парсер не может предположить, что шаблон (a, b) будет соответствовать, как результат .InInstanceOf [Tuple2] не может быть статически известна до тех пор, пока машинка.