Я пытаюсь понять scala реализацию соответствия шаблонов List и
есть вопрос о том, как первый оператор case (::, который разделяет список на 1-й, 2-й и остальные) реализован под капотом в List.scala
list match{
case h1 :: h2 :: rest => println(h2)
case _ =>
}
Я пытался понять, сравнивая это с Option Monad, и ниже мое понимание того, как работает сопоставление с шаблоном Option:
Когда я обертываю объект внутри Опция ниже вызывается из Option.scala
, и это дает мне значение Some или None
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
затем При совпадении с шаблоном i в Option сравнивается одно из следующих значений, и я могу вызывать методы того же
final case class Some[+A](x: A) extends Option[A] {
def isEmpty = false
def get = x
}
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
Когда я ищу похожую реализацию в List.scala, я могу найти реализацию case для Nil (case object Nil extends List[Nothing]
), которая будет вызываться для case Nil
сопоставления с образцом
но я пытаюсь понять, как выражение case h1 :: h2 :: rest
соответствует реализации Case.scala
Спасибо, что заглянули, и, пожалуйста, добавьте комментарий, если в моем вопросе отсутствует необходимая информация для его просмотра.