Разница в выравнивании параметра [List [Int]] в 2.9.1 и 2.10 по ночам - PullRequest
10 голосов
/ 29 ноября 2011

Я получаю различное поведение в 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)

Против:

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 Ответ

16 голосов
/ 29 ноября 2011

Причина в том, что 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].

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...