所以我读到了像Scala中的cons运算符这样的右关联运算符。我想知道为什么他们在案例陈述中工作。看起来你可以使用这里的cons语句进行模式匹配吗?
def findKth1[A](k:Int, l:List[A]):A = (k, l) match {
case (0, h::_) => h
case(k, _::tail) if k > 0 => findKth1(k - 1, tail)
case _ => throw new NoSuchElementException
}
findKth1(2, List(3,4,5,6))
res1: Int = 5
占位符在这里做什么?我只看到在这样的函数中使用的占位符:<SomeList>.map(_.doThing)
。是同一个概念吗?
::
和:::
的唯一区别是:::
用于2个列表吗?
答案 0 :(得分:4)
tl; dr 它不是模式匹配运算符,它的模式匹配一个名为::
的案例类
同时发生了一些事情。首先,可能会有一些混淆,因为::
是List上的方法:
val x: List[Int] = 1 :: 2 :: 3 :: Nil
但还一个case class ::
根据文档是:
A non empty list characterized by a head and a tail.
Scala的案例类自动带有提取器方法(unapply
),允许模式匹配,如case User(name, age) => ...
中所示。
您也可以在 infix 位置使用案例类名称(尽管您不应该这样做,除非案例类像运算符一样使用,例如在此案件)。因此case head :: tail => ...
与case ::(head, tail) => ...
相同。 More info here
模式匹配时,您可以使用_
表示那里会有值,但您并不关心它,因此您无法为其提供名称。
所以你提供的三个案例大致是:
h
的头部列表,以及一个我们将忽略的尾部。k
的整数元组,一个我们不关心的头部列表,以及一个尾部,我们称之为tail
。此外,k
必须大于0