我想展平一系列的集合:

val test = for(i <- 1 to 3) yield {
  if(i == 1)
    Set.empty
  else
    Set(9, 1)
}
val b = test.flatten

这失败了:



但真正让我困惑的是为什么这有效?:
val test = for(i <- 1 to 3) yield {
  if(i == 1)
    Set.empty
  else
    Set(9, 1)
}
println(test.flatten)
// compiles and prints Vector(9, 1, 9, 1) when run

所以我的问题是: println(test.flatten) 中的 flatten 和 val b = test.flatten 中的 flatten 调用有什么区别?

最佳答案

或者,应该可以反转您的条件并使其成为 for 中的守卫,并在那里使用您的 Set :

val b = for {
  i <- 1 to 3
  if i != 1
  j <- Set(9, 1)
} yield j

// b: scala.collection.immutable.IndexedSeq[Int] = Vector(9, 1, 9, 1)

关于scala - 调用 flatten 无法在一个用例上编译,但在另一个用例上有效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45107536/

10-10 05:18