问题描述
在the Scala spec中,有14种“命名”模式的定义(“模式绑定器”除外),我不知道哪种模式是以下的正确类别:
示例1
List("A","B","C") match {
case head :: Nil => ???
case "A" :: _ :: Nil => ???
case head :: tail => ???
}
这纯粹是学术性的,因为我希望能够引用规范中的命名模式。因此,问题是关于在针对列表引用这些类型的模式时如何解释规范以及如何准确。
例如1,是使用::
(又名Cons
)作为前缀的“ 11. Infix Operation pattern”吗?或“ 7. Constructor Pattern”,因为::
是构造函数?或者如果我们通过在列表(L3)的特定位置使用文字来使其复杂化,是否会调用“ 4. Literal Patterns”?
也许是更简单的情况?
示例2
List(1,4,2,5) match {
case Nil => ???
case head :: tail => ???
}
根据使用的模式,我们将其命名为什么?
解决方法
这是中缀操作模式(8.1.11),是构造函数模式(8.1.7)的简写。
仅使用构造函数模式,示例2如下所示:
List(1,4,2,5) match {
case Nil => ???
case ::(head,tail) => ???
}
,
模式可以组合在一起,因此通常我们不能说发生一种单一的模式。例如
case "A" :: _ :: Nil =>
组合至少四种不同的图案
- 构造函数模式,因为
::
是案例类 - 文字模式,因为
"A"
是字符串文字 - 稳定的标识符模式,因为
Nil
是一个案例对象 - 可变模式,因为
_
是通配符