2010-12-22 16 views
11

Ich studiere etwas scala code und fand diese Methode, die mich verwirrt. In der Match-Anweisung, was ist das [email protected] Konstrukt? Welche Art von Wert enthält es? wenn ich es gedruckt habe, ist es kein Unterschied als tail, aber wenn ich es mit Schwanz ersetze, gibt die Funktion diff result zurück. Kann jemand erklären, was es ist und mir eine richtige Ressource zeigen, um es zu verstehen? (Ich weiß, dass ich in Google suchen, aber nicht wissen, was zu suchen ..)Scala "Spiel" Hilfe

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
    ls match { 
     case Nil => Nil 
     case [email protected](_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f) 
    } 
+0

'@' wird normalerweise in Anmerkungen verwendet, aber ich sehe nichts dergleichen hier ... –

Antwort

28

Ich würde es nennen die "essen Sie Ihren Kuchen und haben Sie auch Operator". Auf jeder Ebene des Mustervergleichs können Sie einem Teil einen Namen (vor dem @) geben und es (nach dem @) weiter dekonstruieren. Zum Beispiel stellen Sie sich gegen eine Liste mit drei Elementen entsprechen möchten, müssen Sie das zweite Element, aber Sie wollen die ganze Liste protokollieren:

something match { 
    case [email protected](_,elem,_) => log("matching:" + list); elem  
    case _ => error("not found") 
} 

Ohne diese Funktion hatte man so etwas wie

something match { 
    case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem  
    case _ => error("not found") 
} 
schreiben

Wie Sie sehen können, müssen wir das erste und das dritte Element nennen, nur weil wir sie brauchen eine Liste mit der gleichen Struktur auf der rechten Seite zu erhalten, die vorformulierten ist. Es ist viel einfacher und klarer, wenn Sie der ganzen Sache einen Namen geben können (list), und Teile tiefer in der Struktur (elem), wenn Sie beide auf der rechten Seite brauchen.

+0

Super Erklärung. Danke, Mann!! –

8

In diesem Fall wird sublist eine benannte Variable für die gesamte Liste (_ :: tail). Schwanz ist der, gut, Schwanz der Liste. Ich bin mir nicht sicher, ob es hier einen richtigen Namen für '@' gibt.

Ich sehe nicht wirklich den Zweck der Unterliste hier, da Sie gerade ls direkt verweisen können.

Haftungsausschluss: Ich bin neu in Scala. Ich hoffe, ich habe das richtig verstanden.

+1

Es ist das gleiche in Haskell (und vermutlich ML) auch. – delnan

+0

Hey, danke für die Antwort. Beide Antworten haben mir geholfen, es zu verstehen. –

+10

Es wird in der Sprachreferenz als 'Musterbinder' bezeichnet. – Debilski

Verwandte Themen