シーケンスの理解をパターンマッチする慣用的な方法は何ですか? 質問する

シーケンスの理解をパターンマッチする慣用的な方法は何ですか? 質問する
val x = for(i <- 1 to 3) yield i
x match {
    case 1 :: rest => ... // compile error
}

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

これは同じ問題ですMatchError は、マッチが IndexedSeq を受け取ったが LinearSeq を受け取らなかった場合に発生します。

問題は、それを正しく行うにはどうすればよいか.toListということです。あらゆる場所に追加するのは適切ではないようです。また、(他の質問の回答で説明されているように) すべてを処理する独自の抽出プログラムを作成すると、Seq全員がそれを実行すると混乱が生じます...

質問は、シーケンスの内包表記の戻り値の型に影響を与えることができないのはなぜか、または、なぜそのような一般化されたSeq抽出機能が標準ライブラリの一部ではないのか、ということだと思います。

ベストアンサー1

まあ、どんなシーケンスでもパターンマッチできます:

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

おすすめ記事