" ::(a,b)"的模式匹配的差异和"列出(a,b)"

时间:2014-07-21 16:06:02

标签: list scala pattern-matching

使用::模式匹配列表:

val ::(a, tail) =  List(1,2,3)

// a: Int = 1
// tail: List[Int] = List(2, 3)

但是List

val List(a, tail) = List(1,2,3)

// match error

我试图找出为什么后者无法匹配,但没有幸运。

我在abstract class SeqFactory中看到,有unapplySeq方法:

def unapplySeq[A](x: CC[A]): Some[CC[A]] = Some(x)

但当xList[Int]时,返回值仍为Some[List[Int]],我无法找到魔法的位置

1 个答案:

答案 0 :(得分:3)

原因很简单。

List(1,2,3)是包含3个元素的列表:[1,2,3],类似地List(head, tail)是包含2个元素的列表:[head, tail]。它是但不是头部和它的尾巴。

scala> val hd :: tl = List(1,2,3) // val hd :: tl works the same as ::(hd, tl)
hd: Int = 1
tl: List[Int] = List(2,3)

scala> val List(a,b,c) = List(1,2,3)
a: Int = 1
b: Int = 2
c: Int = 3

因此,当您想使用List取消应用列表时,您需要匹配所述列表中的确切项目数。否则,请使用更具历史性的::运算符来获取头部和尾部