2016-06-05 4 views
3

Я пытаюсь понять код ниже, но застрял на 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) 
} 
+2

Вы должны прочитать о [* соответствующий рисунок *] (HTTP: // docs.scala-lang.org/tutorials/tour/pattern-matching.html). Здесь, если в списке 'xs' имеется хотя бы один элемент, то этот элемент (глава списка) привязан к' y', а остальное (хвост списка) привязывается к 'ys'. – Jubobs

+1

Да. Или, чтобы ответить на ваш вопрос напрямую - двойная двоеточие называется оператором cons, она используется в списках, а это означает head :: tail (поскольку списки реализованы так: каждый список является рекурсивной цепочкой элемента head и «остальным», , которые снова состоят из головы и остального и т. д., пока вы не нажмете голову :: Nil) – slouc

+0

@Jubobs Я прочитал эту запись в блоге, но из нее я не мог найти здесь отношения к этому делу. Однако ваши комментарии помогли. Мне все еще странно, что совпадение выполняется в логике 'if the list has elements ', поскольку это не кажется интуитивным вообще из выражения' y :: ys', что это значит. –

ответ

3

Я не вижу никаких заявлений для у и YS, поэтому там, где они берутся?

Что вы видите is Декларация.

Корпус может деконструировать значение (здесь xs) в его части в соответствии с рисунком, если это «соответствует» (см. Его?). Здесь список деконструирован в голову (давая ему имя y) и хвост/отдых (давая ему имя ys). Теперь эти две части можно получить отдельно в выражении после стрелки.

1
case y :: ys => 

Это эквивалент сопоставления с образцом для списков, где ваши x матчей с head списка в то время как ys матчей с tail. В шаблоне Maching позволяет де-структуры вход, чтобы соответствовать заданному шаблону, в данном случае список с y как голова и хвост ys как