模式匹配序列理解的惯用方法是什么?

let*_*aik 19 scala pattern-matching for-comprehension

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

构造函数无法实例化为期望的类型; found:collection.immutable.::: [B] required:scala.collection.immutable.IndexedSeq [Int]

当匹配收到IndexedSeq而不是LinearSeq时,这与MatchError的问题相同.

问题是,怎么做对了?.toList到处添加似乎不对.并创建一个自己的提取器来处理每一个Seq(如另一个问题的答案所述)如果每个人都这样做会导致一团糟......

我想问题是,为什么我不能影响序列理解的返回类型,或者:为什么不是Seq标准库的这种通用提取器部分?

oxb*_*kes 35

好吧,你可以模式匹配任何序列:

case Seq(a, b, rest @ _ *) =>
Run Code Online (Sandbox Code Playgroud)

例如:

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
Run Code Online (Sandbox Code Playgroud)

然后,这将匹配任何具有多于(或等于)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
Run Code Online (Sandbox Code Playgroud)