Разница в сглаживании опциона [Список [Int]] в 2.9.1 и 2.10 ночью

У меня другое поведение в 2.9.1 и 2.10 в ночное время - что изменилось?

Welcome to Scala version 2.9.1.final (OpenJDK Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> Some(3) map (x => List(x, -x)) flatten
res0: List[Int] = List(3, -3)

Versus:

Welcome to Scala version 2.10.0.r26084-b20111129020255 (OpenJDK Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> Some(3) map (x => List(x, -x)) flatten
<console>:8: error: Cannot prove that List[Int] <:< Option[B].
              Some(3) map (x => List(x, -x)) flatten

Ответ 1

Причина в том, что Option приобрел метод flatten в 2.10, который работает только на вложенных Option s.

В 2.9 вызов flatten был добавлен неявным преобразованием в Iterable, и результатом был Iterable (или его подтип, в зависимости от вложенного значения внутри Option).

Здесь подпись flatten в 2.10:

def flatten[B](implicit ev: <:<[A, Option[B]): Option[B]

В нем говорится: если вы можете найти доказательства того, что элемент внутри этой опции сам Option, скажем Option[B], я могу сгладить это и вернуть Option[B].

Implicits проверяются только, если нет метода с этим именем, поэтому это объясняет, почему он не возвращается к методу 2.9.