Разница в сглаживании опциона [Список [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.