Scala match decomposition on infix operator

infix-operator, list, match, scala

Solution

Jay Conrad's answer is almost right. The important thing is that somewhere there is an object named `::` which implements the `unapply` method, returning type `Option[(A, List[A])]`. Thusly:

object :: {
  def unapply[A](ls: List[A]): Option[(A, A)] = {
    if (ls.empty) None
    else Some((ls.head, ls.tail))
  }
}

// case objects get unapply for free
case object Nil extends List[Nothing]

In the case of `::` and `List`, this object happens to come out of the fact that `::` is a case class which extends the `List` trait. However, as the above example shows, it doesn't have to be a case class at all.

Problem

I'm trying to understand the implementation of `List`s in Scala. In particular I'm trying to get my head around how you can write match expressions using an infix operator, for example: ``` a match { case Nil => "An empty list" case x :: Nil => "A list without a tail" case x :: xs => "A list with a tail" } ``` How is the match expression allowed to be `x :: xs` rather than `List(x, xs)`?

Original source

Related problems