调用flatten无法在一个用例上编译,但在另一个用例上工作

时间:2017-07-14 16:17:21

标签: scala flatten

我想展平一系列集合:

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

这失败了:

  

ScalaFiddle.scala:7:错误:没有可用的隐式视图   scala.collection.immutable.Set [_&lt;:Int] =&gt;   scala.collection.GenTraversableOnce [B]。 val b = test.flatten                  ^ ScalaFiddle.scala:7:错误:方法flatten的参数不够:(隐式asTraversable:   scala.collection.immutable.Set [_&lt;:Int] =&gt;   scala.collection.GenTraversableOnce [B])scala.collection.immutable.IndexedSeq [B]。   未指定的值参数asTraversable。 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)中的展平与val b = test.flatten中的展平之间的区别是什么?

2 个答案:

答案 0 :(得分:1)

感谢Michael Zajac的评论我得到了它。

无论

val test = for(i <- 1 to 3) yield {
  if(i == 1)
    Set.empty[Int]
  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)
}
val b: Seq[Int] = test.flatten

应该有效。在Set.empty上设置类型或告诉编译器我们期望val b的类型。

答案 1 :(得分:1)

或者,应该可以在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)

nativeEvents