2013-06-18 25 views
10

Ich versuche, Mustervergleich zu verwenden, um eine Rechneranwendung zu schreiben.Datensatztyp Mustervergleich in Ocaml

Zwei Haupttypen wie unten definiert:

type key = Plus | Minus | Multi | Div | Equals | Digit of int;; 

type state = { 
    lcd: int; (* last computation done *) 
    lka: key; (* last key actived *) 
    loa: key; (* last operation actived *) 
    vpr: int (* value print on the screen *) 
};; 

let print_state s = 
    match s with 
    state (a,_,_,d) -> print_int a; //Here has the compile error 
       print_newline(); 
       print_int d; 
        print_newline();; 

Wenn ich jedoch einen Zustand wie haben:

let initial_state = { lcd=0; lka=Equals; loa=Equals; vpr=0 } ;; 

Dann, wenn ich die Funktion aufrufen:

print_state initial_state;; 

Es wird habe den Kompilierfehler. Jeder kann sagen, was der Grund für eine erfolglose Kompilierung ist. Danke in adv.

Error: Syntax error 
unexpected token "(" 
+1

Aber warum passen Sie Muster auf Aufzeichnungen? Verwenden Sie 'initial_state.lcd', um die' lcd' aus 'initial_state' zu ​​holen. – ben

Antwort

19

Ein Datensatz Muster sieht aus wie ein Rekord:

match s with 
| { lcd = a; vpr = d; _ } -> (* Expression *) 
+0

Danke. Löste mein Problem. – yjasrc

+4

@yjasrc In modernen OCaml können Sie auch den '=' -Teil überspringen, wenn Sie die Variable auf die gleiche Weise wie die Bezeichnung benennen: 'match s with {lcd; vpr; _} -> print_int lcd; print_int vpr'. – lukstafi

+1

Um den Kommentar von luksatfi hinzuzufügen, ist es auch nicht notwendig, eine Übereinstimmungserklärung zu haben. 'let print_state {lcd; vpr; _} = ... 'sollte genug sein. – rgrinberg