Как работает цикл for с несколькими генераторами в Scala? - PullRequest
0 голосов
/ 30 сентября 2018

Я новичок в Scala и пришел к этому с необходимостью, но я хотел бы понять это с функциональной точки зрения.Я очень озадачен поведением следующих фрагментов кода.

val res = for {
  i <- 1 to 2
  j <- 1 to 2
} yield (i, j)

println(s"res is $res")

Этот код напечатает res is Vector ((1,1), (1,2), (2,1)), (2,2)) как и ожидалось.Тем не менее, слегка изменив вышеприведенное значение до

val res = for {
  i <- 1 to 2
  j <- i to 0
} yield (i, j)

println(s"res is $res")

print res is Vector ()

Почему вторая версия цикла не дает Vector ((1,1), (1,0), (2,2), (2,1), (2,0))?

Это поведение оказывает значительное влияние на мою способность циклически перемещаться по 2D-матрицам с использованием индексов вScala.В общем, как можно зацикливаться ТОЛЬКО на верхней треугольной части матрицы идиоматическим образом, отслеживая индексы строк и столбцов?

1 Ответ

0 голосов
/ 30 сентября 2018

Пусть REPL скажет вам.

scala> 1 to 2
res0: scala.collection.immutable.Range.Inclusive = Range 1 to 2

scala> 1 to 0
res1: scala.collection.immutable.Range.Inclusive = empty Range 1 to 0
                                                   ^^^^^

A Range не пойдет вниз, если вы не скажете это.

val res = for {
  i <- 1 to 2
  j <- i to 0 by -1
} yield (i, j)
//res: IndexedSeq[(Int, Int)] = Vector((1,1), (1,0), (2,2), (2,1), (2,0))
...