Scala: дают попарные комбинации двух петель
Я хотел бы создать коллекцию с кортежами, содержащими все попарные комбинации из двух списков. Что-то вроде:
for ( x <- xs )
for ( y <- ys )
yield (x,y)
В Python это будет работать, в Scala, по-видимому, for
выводится только для последнего цикла (поэтому это оценивается как Unit
)
Каков самый чистый способ реализовать его в Scala?
Ответы
Ответ 1
Вы были почти там:
scala> val xs = List (1,2,3)
xs: List[Int] = List(1, 2, 3)
scala> val ys = List (4,5,6)
ys: List[Int] = List(4, 5, 6)
scala> for (x <- xs; y <- ys) yield (x,y)
res3: List[(Int, Int)] = List((1,4), (1,5), (1,6), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6))
Ответ 2
Немного более откровенный в соответствии с Николасом:
В Scala вы можете использовать несколько генераторов в одном для понимания.
val xs = List(1,2,3)
val ys = List(4,5)
for {
x <- xs
y <- ys
} yield (x,y)
res0: List[(Int, Int)] = List((1,4), (1,5), (2,4), (2,5), (3,4), (3,5))
Вы даже можете оценить в понимании.
for {
x <- xs
y <- ys
if (x + y == 6)
} yield (x,y)
res1: List[(Int, Int)] = List((1,5), (2,4))
Или выполните задание.
for {
x <- xs
y <- ys
val z = x + y
} yield (x,y,z)
res2: List[(Int,Int,Int)] = List((1,4,5), (1,5,6), (2,4,6), (2,5,7), (3,4,7), (3,5,8))