Как использовать yield с многостраничностью для? - PullRequest
1 голос
/ 15 декабря 2011

Код только для иллюстрации, т. Е. пример , а не реальный код.

Я пробовал это:

val results = for(i <- 1 to 20)
{
  val x = i+1
  println(x)
  yield x
}

и это

val results = for {i <- 1 to 20;
  val x = i+1;
  println(x)
}
  yield x

Но ничего из этого не работает - мне нужен генератор, определение и утверждение - возможно ли это сделать с помощью yield? Если да, какой правильный синтаксис?

Ответы [ 2 ]

8 голосов
/ 15 декабря 2011

Надеюсь, это поможет вам начать:

  val result = for (i <- 1 to 10 if i%2==0) yield {
     println(i); 
     i
  }

, что эквивалентно

 (1 to 10).filter(_%2==0).map(x => { println(x); x } )
3 голосов
/ 15 декабря 2011

Вы, кажется, думаете, что for в Scala похож на for в императивных языках.Это не!За кулисами используется flatMap.Каждое выражение в первом разделе синтаксиса for/yield должно иметь определенную форму.Если я не ошибаюсь, это должно быть либо присваивание (возможно, ограниченное val), либо выражение <-.Вы можете взломать его, чтобы получить то, что вы хотите:

for {
  i <- 1 to 20
  val x = i + 1
  _ <- {println(x); List(1)}
} yield x

Но это довольно ужасно.Взломать yield, как продемонстрировал Джамиль, также возможно, хотя и довольно ужасно.

Вопрос в том, чего именно вы пытаетесь достичь?foreach лучше всего использовать для кода с побочными эффектами:

(1 to 10) foreach { i =>
  val x = i+1
  println(x)
}

map лучше всего использовать для создания нового списка такой же длины:

(1 to 10) map (i => i + 1)

Это довольнонеобычно и несколько уродливо хотеть сделать и то и другое одновременно.

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