20
val x = for(i <- 1 to 3) yield i
x match {
    case 1 :: rest => ... // compile error
}

コンストラクターを期待される型にインスタンス化できません。見つかった: collection.immutable.::[B] 必須: scala.collection.immutable.IndexedSeq[Int]

これは、 match が IndexedSeq を受け取っても LinearSeq を受け取っていない場合の MatchErrorと同じ問題です。

問題は、それを正しく行う方法です。どこにでも追加する.toListのは正しくないようです。そして、Seq(他の質問の回答で説明されているように)すべてを処理する独自のエクストラクターを作成すると、誰もがそれを行うと混乱につながります...

問題は、シーケンス内包表記の戻り値の型に影響を与えられないのはなぜですか、または、そのような一般化されたSeqエクストラクタが標準ライブラリの一部ではないのはなぜですか?

4

2 に答える 2

35

さて、任意のシーケンスをパターンマッチできます:

case Seq(a, b, rest @ _ *) =>

例えば:

scala> def mtch(s: Seq[Int]) = s match { 
  |      case Seq(a, b, rest @ _ *) => println("Found " + a + " and " + b)
  |      case _ => println("Bah") 
  |    }
mtch: (s: Seq[Int])Unit

次に、これは2つ以上の(または等しい)要素を持つ任意のシーケンスに一致します

scala> mtch(List(1, 2, 3, 4))
Found 1 and 2

scala> mtch(Seq(1, 2, 3))
Found 1 and 2

scala> mtch(Vector(1, 2))
Found 1 and 2

scala> mtch(Vector(1))
Bah
于 2012-07-16T11:20:09.690 に答える
0

REPL での Vector のもう 1 つの解決策:

Vector() match {
    case a +: as => "head + tail"
    case _       => "empty"  
}
 res0: String = "empty"

Vector(1,2) match {
  case a +: as => s"$a + $as"
  case _      => "empty"  }
res1: String = 1 + Vector(2)
于 2018-11-22T15:17:53.690 に答える