Scala List Case Pattern Соответствие Вопросу Реализации: - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь понять 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

Спасибо, что заглянули, и, пожалуйста, добавьте комментарий, если в моем вопросе отсутствует необходимая информация для его просмотра.

...