2012-05-17 5 views
26

Ich fand es interessant, dass this puzzler, speziell dieser Code:Was genau hat Scala mit Pattern Matching in 2.10 verbessert?

val (i, j): (Int, Int) = ("3", "4") 

schlägt zur Laufzeit in Scala 2.9.1, aber w/2.10 M3 (die groß ist) bei der Kompilierung fehlschlägt. Ich versuche zu verfolgen, was in neuen Scala Releases kommt, aber ich kann die Punkte hier nicht verbinden. Welche Verbesserung führte zu diesem präziseren Verhalten?

+2

Ich habe keine Ahnung, warum das zur Laufzeit fehlschlagen und die Zeit in keiner Version von Scala kompilieren würde. –

+0

Ich denke, dass es irgendwo durch einen Test gerutscht ist. Es ist wirklich irgendwie witzig: Ich habe gestern mit einem Python-Devotee darüber gesprochen, wie großartig Scala ist, nur um heute zu finden, dass Scala versagt, wenn sie mit einer Aufgabe konfrontiert wird, die fast schon klassischer Python ist. – pmcs

+1

'val (i: Int, j: Int) = (" 3 "," 4 ")' scheitert zur Kompilierzeit in 2.9.1 – Rogach

Antwort

10

Die Sache, die vor sich geht, ist, dass der neue Mustervergleicher viel leichter zu verbessern und zu behalten ist, weil es kein Rattenneststück des Codes ist. Der folgende Beispielcode sollte auch die gleiche Änderung zeigen:

("3", "4") match { case (i, j): (Int, Int) => /* whatever */ } 

Was geschieht, ist Scala Verständnis bei der Kompilierung, dass das Muster kann nie erreicht werden.

16

In Scala 2.10 wurde der Muster-Matcher komplett neu geschrieben und ist nun der virtualisierte Muster-Matcher. Read more about it!

+1

Nun, der virtuelle Teil ist nur intern, es sei denn, Sie übergeben eine Flagge, Iirc. Die tatsächliche Ausgabe ist nicht virtuell (dh sie ist nicht als Aufrufe einer Monade implementiert). –

+1

Nun, ja. Aber der Hauptpunkt ist, dass es eine komplette Neuschreibung darstellt (was erklären würde, warum sich sein Verhalten möglicherweise geändert hat). –

+0

Warum sollte der Mustervergleicher für dieses Beispiel einen Unterschied machen? Ich würde erwarten, dass der Compiler den Code während der Typprüfung zurückweist, bevor er überhaupt zum Mustervergleich kam ... –