Scala - 可以使用for循环多次使用?

Mon*_*bal 17 scala yield cartesian-product

一个例子:

val l = List(1,2,3)
val t = List(-1,-2,-3)
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?

for (i <- 0 to 10) yield (l(i)) yield (t(i))
Run Code Online (Sandbox Code Playgroud)

基本上我想为每次迭代产生多个结果.

Jam*_*Iry 22

目前还不清楚你要求的是什么 - 你期望多重收益的语义是什么.但有一件事是你可能永远不想使用索引来导航列表 - 每次调用t(i)都是O(i)来执行.

所以这是你可能会要求的一种可能性

scala> val l = List(1,2,3); val t = List(-1,-2,-3)
l: List[Int] = List(1, 2, 3)
t: List[Int] = List(-1, -2, -3)

scala> val pairs = l zip t
pairs: List[(Int, Int)] = List((1,-1), (2,-2), (3,-3))
Run Code Online (Sandbox Code Playgroud)

这是你可能会要求的另一种可能性

scala> val crossProduct = for (x <- l; y <- t) yield (x,y)
crossProduct: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
Run Code Online (Sandbox Code Playgroud)

后者只是语法糖

scala> val crossProduct2 = l flatMap {x => t map {y => (x,y)}}
crossProduct2: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))
Run Code Online (Sandbox Code Playgroud)

第三种可能性是你想要交错它们

scala> val interleaved = for ((x,y) <- l zip t; r <- List(x,y)) yield r
interleaved: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
Run Code Online (Sandbox Code Playgroud)

这是语法糖

scala> val interleaved2 = l zip t flatMap {case (x,y) => List(x,y)}
interleaved2: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 5

不,你不能使用多个yield子句,但有一些解决方法.例如:

for (i <- 0 to 10;
     r <- List(l(i), t(i)))
yield r
Run Code Online (Sandbox Code Playgroud)

当然,你可以嵌套for-comprehension,但这会产生一个元素列表列表,我不相信你想要的.