необъяснимый результат для понимания в Scala

Я так понимаю for-expression переводится в карту и flatMap. Но я нашел кое-что, что не могу объяснить и нуждаюсь в вашей помощи. Вот два примера игрушек:

for {
    None <- List(Option(1),None)
} yield 0

//res0: List[Int] = List(0, 0)

Q1: Почему Some(1) сопоставляется с 0 ? Я ожидал Список(0),

update1:
спасибо за комментарий @marios , он более странный.
for(None <- List(Some(1), None) ) yield None возвращает List(Some(1), None).

update2:
некоторые говорят, что это переменная, но в IDE она действительно связана с объектом None.


Я использую IntelliJ для автоматического перевода приведенного выше for-expression в map-expression:

List(Option(1), None).map { case None => 0 }  

//scala.MatchError: Some(1) 

Вопрос 2. Ожидается ошибка в этом выражении карты, в то время как выражение for в первом вопросе не дает этой ошибки. Почему они получают разные вычисления?


person WeiChing 林煒清    schedule 06.02.2016    source источник
comment
for(None ‹- List(Some(1), None)) yield None. Это возвращает список (некоторые (1), нет). Это так странно.   -  person marios    schedule 06.02.2016


Ответы (2)


Похоже, это ошибка в компиляторе Scala. Язык Scala Спецификация гласит: «На первом этапе каждый генератор p <- e, где p не является неопровержимым для типа e, заменяется на p <- e.withFilter { case p => true; case _ => false }», а затем «a для понимания для (p <- e) yield e′ преобразуется в e.map { case p => e′ }».

Это означает, что ваш пример, for { None <- List(Option(1), None) } yield 0, должен быть переведен на

List(Option(1),None).withFilter { case None => true; case _ => false }.map{case None => 0}

который оценивается как List(0), как вы и ожидали.

person Ben    schedule 06.02.2016

Эти два возвращают один и тот же результат.

for(None <- List(Some(1), None) ) yield None
for(x <- List(Some(1), None) ) yield x

Похоже, что None <- не является эффективным средством отбрасывания значения. Вместо этого он просто создает временную переменную, которая маскирует объект None.

person jwvh    schedule 06.02.2016
comment
Я думал о том же: проблема с маскировкой. Я никогда не видел, чтобы для понимания использовалось то, как его использует спрашивающий.... довольно странно, или это довольно распространено? - person jm0; 06.02.2016
comment
Нет, это не переменная. В IDE (рабочий лист IntelliJ) он действительно ссылается на None объект типа Option. Это сопоставление с образцом. - person WeiChing 林煒清; 06.02.2016