Вы, кажется, думаете, что 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)
Это довольнонеобычно и несколько уродливо хотеть сделать и то и другое одновременно.