2015-06-22 12 views
9

Ich (versehentlich) stieß auf ein bisschen Pattern-Matching-Syntax, die ich nicht erwarten zu kompilieren und jetzt kann nicht herausfinden.Scala unapplySeq Extractor Syntax

Es scheint im Zusammenhang mit unapplySeq.

Notiere den case x List(_,_) Teil in diesem einfachen Beispiel:

val xs = List(1, 2, 3)       //> xs : List[Int] = List(1, 2, 3) 

xs match { 
    case x List (_, _) => "yes" 
    case _    => "no" 
}            //> res0: String = yes 

Ich bin zu : oder @ in Mustererkennung Syntax verwendet, aber ich bin verwirrt darüber. Wie funktioniert diese Syntax und was (wenn überhaupt) ist ihre Beziehung zu unapplySeq?

Beispielcode ausgeführt in Scala 2.11.6

Antwort

3

die entsprechende nicht Infix-Version ist:

xs match { 
    case List(x, _, _) => "yes" 
    case _    => "no" 
} 

Scala specification sagt:

ein Infix Betriebsmuster p; op; q ist eine Abkürzung für den Konstruktor oder das Extraktormuster op (p, q). Die Priorität und Assoziativität von Operatoren in Mustern ist die gleiche wie in Ausdrücken.

Ein Infix-Operationsmuster p; op; (q1, ..., qn) ist eine Abkürzung für das Konstruktor- oder Extraktormuster op (p, q1, ..., qn).

+0

Wo erklären Sie, wie 'case List (x, _, _) =>" yes "' äquivalent zu "case x List (_, _) =>" yes "'? –

+0

In der Infix-Operatornotation befindet sich die Methode zwischen dem Objekt und dem Parameter (oder den Parametern). – bjfletcher

+0

Ich dachte Infix Notation nur für Funktionen mit 2 Argumente? Mit Blick auf die Quelle ist 'List.unapplySeq' definiert' def unapplySeq [A] (x: CC [A]): ​​Einige [CC [A]] = Einige (x) ' –