Я пытаюсь понять код ниже, но застрял на case y :: ys
. Как это определено? Я не вижу никаких объявлений для y
и ys
... Откуда они взялись?Что означает случай y :: ys?
Я понимаю, что 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)
}
Вы должны прочитать о [* соответствующий рисунок *] (HTTP: // docs.scala-lang.org/tutorials/tour/pattern-matching.html). Здесь, если в списке 'xs' имеется хотя бы один элемент, то этот элемент (глава списка) привязан к' y', а остальное (хвост списка) привязывается к 'ys'. – Jubobs
Да. Или, чтобы ответить на ваш вопрос напрямую - двойная двоеточие называется оператором cons, она используется в списках, а это означает head :: tail (поскольку списки реализованы так: каждый список является рекурсивной цепочкой элемента head и «остальным», , которые снова состоят из головы и остального и т. д., пока вы не нажмете голову :: Nil) – slouc
@Jubobs Я прочитал эту запись в блоге, но из нее я не мог найти здесь отношения к этому делу. Однако ваши комментарии помогли. Мне все еще странно, что совпадение выполняется в логике 'if the list has elements ', поскольку это не кажется интуитивным вообще из выражения' y :: ys', что это значит. –