1

大文字と小文字が一致する上に書かれた 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))  
4

1 に答える 1