2017-07-14 6 views
3

上で動作します:コールは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の間にありますか?

+2

短い答え:型推論はで 'Any'の型パラメータを記入します後者の場合は、前者の場合は存在型です。 _why_はそれよりはるかに複雑です。しかし 'Set'は不変で、それは必然的に問題を引き起こすので、Set.emptyの代わりに' Set.empty [Int] 'を使うべきです。 –

+0

恐ろしく、ありがとう!私の実際の使用法はもう少し複雑で、 'b'の型を設定することで動作させました。 – Flurin

答えて

0

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のどのタイプを期待しているかを伝えてください。

0

代わりに、あなたの状態を反転し、それ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)