案例y :: ys是什么意思?

时间:2016-06-05 19:33:29

标签: scala pattern-matching

我试图理解下面的代码,但却陷入case y :: ys。这是如何定义的?我没有看到yys的任何声明......它们来自哪里?

我理解case匹配尝试在对象上做等于,但case y :: ys似乎是一个操作。这里发生了什么?

def f(xs: List[Int], g: (Int, Int) => Boolean) = {
  def h(x: Int, xs: List[Int]): List[Int] =
    xs match {
      case List() => List(x)
      case y :: ys => if (!g(x, y)) x :: xs else y :: h(x, ys)
    }
  (xs :\ List[Int]())(h)
}

3 个答案:

答案 0 :(得分:4)

  

我没有看到y和ys的任何声明,所以它们来自哪里?

您看到的声明。

案例能够根据模式将值(此处xs)解构为其部分,如果“匹配”(请参阅​​?)。 这里将列表解构为头部(名称为y)和尾部/休息(名称为ys)。现在可以在箭头后面的表达式中单独访问这两个部分。

答案 1 :(得分:1)

case y :: ys =>

这相当于列表的模式匹配,其中x与列表的head匹配,ystail匹配。在模式加工中,您可以解构输入以匹配给定的模式,在这种情况下,列表中y为头部,ys为尾部

答案 2 :(得分:0)

与其他答案一样,case y :: ys与列表的head(y)和tail(ys)匹配。

它实际上是一种语法糖,::case class,您可以检查docscase y :: ys  等于case ::(y, ys)