2

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

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

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

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

update1:
благодаря комментарию @marios, тыс один более странно.
for(None <- List(Some(1), None)) yield NoneList(Some(1), None).

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


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

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

//scala.MatchError: Some(1) 

Q2: Погрешности от этой карты-выражения, как ожидается, в то время как для самовыражения в первом вопросе не дает мне этой ошибки. Почему они получают разные вычисления?

+1

for (None <- List (Some (1), None)) yield None. Это возвращает List (Some (1), None). Это так странно. – marios

ответ

2

Это похоже на ошибку в компиляторе Scala. В Scala Language Specification говорится: «На первом этапе каждый генератор 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), как вы ожидали.

2

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

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

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

+0

Я думал о том же самом: проблема маскировки. Я никогда не видел, чтобы понимание использовалось так, как обманщик использует его ... довольно странно, или это довольно часто? – jm0

+0

Нет, это не переменная. В IDE (рабочий лист IntelliJ) он действительно ссылается на объект 'None' типа' Option'. Это соответствие шаблонов. –

 Смежные вопросы

  • Нет связанных вопросов^_^