2013-05-04 5 views
7

Warum ist es nicht möglich, Mustervergleichskonstrukte zu ketten? Zum Beispiel ist die folgende rechtliche, wenn unsinnig,Pattern Match "Rückgabewert"

val a = ADT(5) 

val b = a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} 
b match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

aber die folgende nicht:

a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

Ich vermute, es ist, weil ich es nicht in erster Linie sollte tun, aber im Prinzip Ich verstehe nicht, warum das nicht legal ist.

+4

'(ein Spiel {..}) Spiel {..}' arbeiten. – user2246674

Antwort

5

Ja sollte es funktionieren, denn (fast) alles in Scala ist ein Ausdruck und jeder Ausdruck kann als Mustervergleich verwendet werden.

In diesem Fall ist die Musterübereinstimmung ein Ausdruck, sodass sie von einer anderen "verketteten" Musterübereinstimmung verwendet werden kann. Aber der Compiler mag es nicht.

gibt den Compiler einen kleinen Hinweis mit Klammern hilft:

case class ADT(value: Int) 

val a = ADT(5) 

(a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
}) match { 
    case ADT(a) if a > 13 => println(a) 
    case _ => {} 
} 
+0

Ich stolperte auch über die Umgehung der Klammern, aber ich verstehe nicht, warum es hier notwendig ist, aber nicht notwendig mit etwas wie: val a = if (false) 6 else if (wahr) if (true) 5 else 3 else 2' –

+0

@CarlSummers kann der Compiler nur so viel ableiten. Es ist nur die Reihenfolge der Operationen. Im Zweifelsfall (Sie oder der Compiler) werden Sie explizit. (Ich bin eigentlich neu in Scala, aber das ist eines der Dinge, die ich daran liebe.) – hangtwenty

3

Ihre Intuition ist korrekt; es ist kein Unsinn — normalerweise wäre in der Lage, Infix-Operatoren so zu ketten, ohne Klammern (wie andere Benutzer vorgeschlagen haben). Tatsächlich wurde match als Methode — implementiert und als Infix-Operator (standardmäßig links assoziativ) — gearbeitet, so dass Ihre alternative Syntax funktioniert hätte. In Scala 2.5 wurde jedoch match ein spezielles Sprachkonstrukt anstelle einer Methode erstellt. Leider weiß ich nicht, warum das gemacht wurde, aber das ist der Grund: match ist nicht ein Infix-Operator, obwohl es so scheint.