Frage

Ich versuche die Implementierung von zu verstehen Lists in Scala. Insbesondere versuche ich, mich mit einem Infix -Operator mit dem Übereinstimmungsausdruck zu machen, beispielsweise mit einem Infix -Operator:

a match {
  case Nil => "An empty list"
  case x :: Nil => "A list without a tail"
  case x :: xs => "A list with a tail"
}

Wie darf der Match -Ausdruck sein x :: xs statt List(x, xs)?

War es hilfreich?

Lösung

Jay Conrads Antwort ist fast richtig. Das Wichtigste ist, dass das irgendwo Es gibt ein Objekt benannt :: das implementiert die unapply Methode, zurückgegebener Typ Option[(A, List[A])]. So:

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]

Im Falle des :: und List, Dieses Objekt kommt zufällig aus der Tatsache heraus, dass :: ist eine Fallklasse, die die erweitert List Merkmal. Wie das obige Beispiel zeigt, nicht haben überhaupt eine Fallklasse sein.

Andere Tipps

Ich glaube :: ist eigentlich eine Klasse (Welches ist eine Unterklasse der Liste), also sagen x :: xs ist meistens gleichwertig zu List(x, xs).

Sie können dies mit anderen Fallklassen mit Bedienungsnamen tun. Zum Beispiel:

case class %%%(x: Int, y: Int)

a match {
  case x %%% y => x + y
}

Wie darf der Match -Ausdruck X :: XS anstelle von Liste (x, xs) sein?

Um diese Frage zu beantworten:

Wenn als ein gesehen Muster, ein Infixbetrieb wie z. p op q ist äquivalent zu op (p, q). Das heißt, der Infix -Operator OP wird als a behandelt Konstruktormuster.

(Programmierung in Scala, 1. Aufl., S. 331)

Siehe auch Scala -Fallklassen Fragen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top