模式匹配带有 head :: tail 的列表(使用什么模式)?

Tob*_*oby 2 scala pattern-matching

Scala 规范中有 14 个“命名”模式的定义(不包括“模式绑定器”),我无法确定哪个是以下模式的正确类别:

示例 1

List("A", "B", "C") match {
   case head :: Nil     => ???
   case "A" :: _ :: Nil => ??? 
   case head :: tail    => ??? 
}
Run Code Online (Sandbox Code Playgroud)

这纯粹是学术性的,因为我希望能够参考规范中的命名模式。因此,问题是关于如何解释规范以及在针对列表引用这些类型的模式时如何准确。

例如 1,它是“ 11. 中缀操作模式”作为::(又名Cons)正在使用中缀吗?或“ 7. Constructor Pattern ”作为::构造函数?或者如果我们通过在列表的特定位置(L3)使用文字使它复杂化,是否会调用“ 4. Literal Patterns ”?

也许是一个更简单的案例?

示例 2

List(1, 4, 2, 5) match {
   case Nil          => ???
   case head :: tail => ???
}
Run Code Online (Sandbox Code Playgroud)

我们会根据使用的模式命名它吗?

Tim*_*Tim 7

它是作为构造器模式(8.1.7)的简写的中缀操作模式(8.1.11 )。

仅使用构造函数模式,示例 2 将如下所示:

List(1, 4, 2, 5) match {
  case Nil          => ???
  case ::(head, tail) => ???
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*lic 6

模式可以组合在一起,所以我们常常不能说发生了一种模式。例如

case "A" :: _ :: Nil =>
Run Code Online (Sandbox Code Playgroud)

结合了至少四种不同的图案

  • 构造函数模式因为::是一个案例类
  • 文字模式因为"A"是字符串文字
  • 稳定的标识符模式,因为它Nil是一个 case 对象
  • 可变模式因为_是通配符