在Scala的case语句中使用cons运算符

时间:2018-05-08 18:28:16

标签: scala

所以我读到了像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个列表吗?

1 个答案:

答案 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.

More info here

Scala的案例类自动带有提取器方法(unapply),允许模式匹配,如case User(name, age) => ...中所示。

您也可以在 infix 位置使用案例类名称(尽管您不应该这样做,除非案例类像运算符一样使用,例如在此案件)。因此case head :: tail => ...case ::(head, tail) => ...相同。 More info here

模式匹配时,您可以使用_表示那里会有值,但您并不关心它,因此您无法为其提供名称。

所以你提供的三个案例大致是:

  • 第一个值为0的元组,第二个值是一个名为h的头部列表,以及一个我们将忽略的尾部。
  • 一个名为k的整数元组,一个我们不关心的头部列表,以及一个尾部,我们称之为tail。此外,k必须大于0
  • 其他任何内容,然后抛出NoSuchElementException