Scala-yield 可以在 for 循环中多次使用吗?

标签 scala yield cartesian-product

一个例子:

val l = List(1,2,3)
val t = List(-1,-2,-3)

我可以做这样的事情吗?

for (i <- 0 to 10) yield (l(i)) yield (t(i))

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

最佳答案

目前尚不清楚您的要求是什么 - 您期望多重 yield 的语义是什么。但有一点是,您可能永远不想使用索引来导航列表 - 每次调用 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))

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

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))

后者只是语法糖

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))

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

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)

这是语法糖

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)

关于Scala-yield 可以在 for 循环中多次使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1140164/

相关文章:

scala - 无法基于 ...Inclusive[Long] 类型的集合构造具有 Long 类型元素的 ...Inclusive[Long] 类型集合

scala - 如何使用 Scala IDE 和 Maven 构建 spark 应用程序?

java - Scala 中的不变性和线程安全

ruby - 如何包装在 Ruby 1.9 中产生的方法

scala - "Distributive property"与无形

scala - Spark 上的 Redis :Task not serializable

Python:如何使用 Tornado 从生成器函数返回?

Python yield 语句每次都返回相同的值

python - 用重复生成排列

python - key 错误 : 'cross' when trying to do cartesian product with merge()