上で動作します:コールは1ユースケースにコンパイルに失敗したが、私はセットのシーケンスを平らにしたい他の
val test = for(i <- 1 to 3) yield {
if(i == 1)
Set.empty
else
Set(9, 1)
}
val b = test.flatten
これはで失敗します。
ScalaFiddle.scala:7: error: No implicit view available from scala.collection.immutable.Set[_ <: Int] => scala.collection.GenTraversableOnce[B]. val b = test.flatten ^ScalaFiddle.scala:7: error: not enough arguments for method flatten: (implicit asTraversable: scala.collection.immutable.Set[_ <: Int] => scala.collection.GenTraversableOnce[B])scala.collection.immutable.IndexedSeq[B]. Unspecified value parameter 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
は私の質問にそうする理由は次のとおりです。differeは何ですかprintln(test.flatten)
のフラットパネルとflattenのコールはval b = test.flatten
の間にありますか?
短い答え:型推論はで 'Any'の型パラメータを記入します後者の場合は、前者の場合は存在型です。 _why_はそれよりはるかに複雑です。しかし 'Set'は不変で、それは必然的に問題を引き起こすので、Set.emptyの代わりに' Set.empty [Int] 'を使うべきです。 –
恐ろしく、ありがとう!私の実際の使用法はもう少し複雑で、 'b'の型を設定することで動作させました。 – Flurin