【问题标题】:No pattern match for Seq[Seq[T]]Seq[Seq[T]] 没有模式匹配
【发布时间】:2019-05-26 01:35:20
【问题描述】:
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

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

【问题讨论】:

    标签: scala pattern-matching seq extractor


    【解决方案1】:

    您使用了错误的提取器! :+ 暗示第一部分是(外部)Seq 的一部分,因此abSeq[String] 类型而不是String,而第二部分Seq(c,d)tail 是被视为元素,所以cd 实际上是String

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

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

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

    符合预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2015-08-04
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多