Подтвердить что ты не робот

Scala: дают попарные комбинации двух петель

Я хотел бы создать коллекцию с кортежами, содержащими все попарные комбинации из двух списков. Что-то вроде:

for ( x <- xs )
  for ( y <- ys ) 
    yield (x,y)

В Python это будет работать, в Scala, по-видимому, for выводится только для последнего цикла (поэтому это оценивается как Unit)

Каков самый чистый способ реализовать его в Scala?

4b9b3361

Ответ 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))