我开始学习Scala,我不太了解模式匹配的一些行为。任何人都可以向我解释为什么第一种情况有效但第二种情况不起作用?
def getFirstElement(list: List[Int]) : Int = list match {
case h::tail => h
case _ => -1
}
Scala> getFirstElement(List(1,2,3,4))
res: Int = 1
Scala> 1 :: List(1,2)
res: List[Int] = List(1, 1, 2)
def getSumofFirstTwoElement(list: List[Int]): Int = list match {
case List(a: Int, b: Int)++tail => a + b
case _ => -1
}
<console>:11: error: not found: value ++
Scala> List(1,2) ++ List(3,4,5)
res: List[Int] = List(1, 2, 3, 4, 5)
答案 0 :(得分:6)
原因是unapply
类型的对象上没有++
方法。 ::
工作的原因是因为幕后真的是:
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
这导致了Scala中如何实现模式匹配。它使用extractors(或here),它们基本上是包含unapply
方法的对象,默认情况下会提供案例类。
答案 1 :(得分:1)
++
是列表对象的方法。我想你想要:
def getSumofFirstTwoElement(list: List[Int]): Int = list match {
case a::b::tail => a + b
case _ => -1
}
答案 2 :(得分:1)
在第二种情况下,++
并非用于取消申请。您希望提取器::
分解列表。
一个很好的解释here。
scala> def getSumofFirstTwoElement(list: List[Int]): Int = list match {
| case a::b::t => a + b
| case _ => -1
| }
getSumofFirstTwoElement: (list: List[Int])Int
scala> getSumofFirstTwoElement(List(1,2,3,4))
res0: Int = 3