大文字と小文字が一致する上に書かれた flatMap を考えてみましょう。例えば:
list.flatMap( v =>
v match {
case Cond1 => if(something) Some(Int) else None
//..Other conditions yielding Option[Int]
case CondN => if(somethingelse) Seq(Int) else Seq()
})
ただし、これはコンパイルされません。seq がすべて Option[Int] またはすべて Seq[Int] の場合、flatMap は機能します。ただし、Seq が Options と Seq の混合である場合はそうではありません。なぜそのような制限が設けられているのですか?これは、今のところ考えられない特定のあいまいさを解決しますか。
EDIT1 REPL からのコード スニペットの追加
scala> val a = Seq(Option(1), Seq(2,3))
a: Seq[Equals] = List(Some(1), List(2, 3))
scala> val b = Seq(Seq(1), Seq(2,3))
b: Seq[Seq[Int]] = List(List(1), List(2, 3))
scala> a.flatMap(x=>x)
<console>:9: error: type mismatch;
found : Equals
required: scala.collection.GenTraversableOnce[?]
a.flatMap(x=>x)
^
scala> b.flatMap(x=>x)
res24: Seq[Int] = List(1, 2, 3)
EDIT2 フィリッポの答えの後、REPLで次のコードを試してみましたが、うまくいきました。
scala> val options = Seq("opt1", "opt2")
options: Seq[String] = List(opt1, opt2)
scala> options.flatMap( x =>
| x match {
| case "opt1" => Some(1)
| case "opt2" => Seq(2,3)
| case _ => None
| })
res27: Seq[Int] = List(1, 2, 3)
各シナリオで解像度はどのように異なりますか。さらに重要なことに、flatMap の代わりにマップすると、結果は作成した a と同じになりSeq
ます。
scala> options.map( x =>
| x match {
| case "opt1" => Some(1)
| case "opt2" => Seq(2,3)
| case _ => None
| })
res28: Seq[Equals] = List(Some(1), List(2, 3))