2017-03-07 2 views
1

Was ich erreichen möchte, ist, Strings und Booleans in eine Liste zu übergeben. Der 'switch'-Operator schaltet die ersten beiden Elemente der Typeingabe, den' und 'Operator und die ersten beiden Elemente um.Handle Variablen nicht in Datentyp

Wie jedoch würde ich eine Fehlerzeichenfolge der Liste hinzufügen ("Fehler"), wenn ich wollte 'und' ein Boolean und eine Zeichenfolge? Außerdem akzeptiert SMl nicht x::y::xs, was ich stattdessen setzen sollte, da ich unabhängig vom Typ wechseln möchte.

datatype input = Bool_value of bool | String_Value of string | Exp_value of string 
datatype bin_op = switch | and 

fun helper(switch, x::y::xs) = y::x::stack 
    | helper(and, Bool_value(x)::Bool_value(y)::xs) = Bool_value(x and y)::xs 

Jede Hilfe geschätzt wird, danke.

Antwort

3

and ist ein Schlüsselwort, also ändern Sie die bin_op zu switch | and_op. x::y::zs ist absolut gültig sml. In der ersten Zeile der Hilfsfunktion ist stack nicht definiert. Schließlich ist das Schlüsselwort zu "und" zwei booleschen zusammen in sml andalso.

Hier ist Code, der kompiliert:

datatype input = Bool_value of bool | String_Value of string | Exp_value of string 
datatype bin_op = switch | and_op 

fun helper(switch, x::y::xs) = y::x::xs 
| helper(and_op, Bool_value(x)::Bool_value(y)::xs) = Bool_value(x andalso y)::xs 

Es gibt unübertroffene Muster, aber ich nehme an, Sie sie entweder ausgelassen oder wird sie später in.

+0

Vielen Dank für die Antwort, es macht Sinn für mich jetzt. – PeskyPotato

1

Es klingt wie Sie einen Interpreter für eine dynamisch typisierte Sprache erstellen. Wenn das stimmt, würde ich zwischen der abstrakten Syntax Ihres Programms und der Fehlerbehandlung des Interpreters unterscheiden, unabhängig davon, ob Sie Exceptions oder Werte verwenden, um Fehler anzuzeigen. Zum Beispiel,

datatype value = Int of int 
       | Bool of bool 
       | String of string 

datatype exp = Plus of Exp * Exp 
      | And of Exp * Exp 
      | Concat of Exp * Exp 
      | Literal of value 

exception TypeError of value * value 

fun eval (Plus (e1, e2)) = (case (eval e1, eval e2) of 
           (Int i, Int j) => Int (i+j) 
           | bogus => raise TypeError bogus) 
    | eval (And (e1, e2)) = (case eval e1 of 
           Bool a => if a 
             then ... 
             else ... 
          | bogus => ...) 
    | eval (Concat (e1, e2)) = (case (eval e1, eval e2) of 
            (String s, String t) => String (s^t) 
           | bogus => raise TypeError bogus) 
+0

Vielen Dank für die Antwort, das sieht ähnlich aus, was ich mit Dolmetschern gemacht habe. – PeskyPotato