Seq[Seq[T]] 没有模式匹配

No pattern match for Seq[Seq[T]]

def example1(sss:Seq[Seq[String]]) = sss match {
  case Seq(a, b) :+ Seq(c, d) :+ tail => true
}

val res1 = example1(Seq(Seq("a", "b"), Seq("c","d")))
// scala.MatchError: List(List(a, b), List(c, d)) 

好吧,我有一个解决方法,就是使用

case Seq(Seq(a, b), Seq(c, d), _*) => true

谁能解释为什么第一个不起作用?

您用错了提取器! :+ 意味着第一部分是(外部)Seq 的一部分,因此 ab 的类型是 Seq[String] 而不是 String,而第二部分Seq(c,d)tail 部分被视为元素,因此 cd 实际上是 String

通常这不会进行类型检查,但在元素类型为 Seq 的情况下,它会进行类型检查。但是,如果您假设 abString,并尝试这样对待它们,类型检查器可能会抱怨,导致更多混乱。

正确的提取器是 +:。冒号在序列的一侧,加号在元素的一侧。因此

  case Seq(a, b) +: Seq(c, d) +: tail => true

符合预期。