2016-04-01 4 views
3

In SML ist es möglich, dass Sie mehrere Muster in einer Case-Anweisung haben?Mehrere Muster in 1 Fall

Zum Beispiel habe ich 4 arithmetische Operatoren ausdrücken in string, "+", "-", "*", "/" und ich möchte "PLUS MINUS" drucken davon "+" or "-" und "MULT DIV" ist, wenn es "*" or "/" ist.

TL; DR: Gibt es irgendwo kann ich vereinfachen, um weniger Fälle zu verwenden?

case str of 
    "+" => print("PLUS MINUS") 
| "-" => print("PLUS MINUS") 
| "*" => print("MULT DIV") 
| "/" => print("MULT DIV") 

Antwort

6

Vorausgesetzt, dass Sie Ihre Frage mit dem Tag versehen haben, dann ja, SML/NJ unterstützt diese Art von Muster. Sie nennen es or-patterns und es sieht wie folgt aus:

case str of 
    ("+" | "-") => print "PLUS MINUS" 
| ("*" | "/") => print "MULT DIV" 

Beachten Sie die Klammern.

Der Master-Zweig von MLton unterstützt es auch als Teil ihrer Successor ML effort, aber Sie müssen MLton selbst kompilieren.

val str = "+" 

val _ = 
    case str of 
    "+" | "-" => print "PLUS MINUS" 
    | "*" | "/" => print "MULT DIV" 

Beachten Sie, dass MLton keine Klammern erfordert. Kompilieren Sie es jetzt mit diesem Befehl (im Gegensatz zu SML/NJ müssen Sie diese Funktion explizit in MLton aktivieren):

2

In Standard ML, nein. In anderen Dialekten von ML, wie OCaml, ja. Sie können in einigen Fällen in Erwägung ziehen, das Aufteilen von Mustern in separate Fälle/Funktionen aufzuteilen oder den Mustervergleich zugunsten eines kürzeren Auffang-Ausdrucks, z.

if str = "+" orelse str = "-" then "PLUS MINUS" else 
if str = "*" orelse str = "/" then "MULT DIV" else ...