2013-06-18 4 views
10

J'essaie d'utiliser la correspondance de modèle pour écrire une application de calculatrice.Enregistrement de correspondance de type d'enregistrement dans Ocaml

Deux grands types définis comme ci-dessous:

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();; 

Cependant, si j'ai un état comme:

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

Puis, quand j'invoque la fonction:

print_state initial_state;; 

Il sera avoir l'erreur de compilation. Tout le monde peut dire quelle est la raison de la compilation infructueuse. Merci à adv.

Error: Syntax error 
unexpected token "(" 
+1

Mais pourquoi êtes-vous filtrage sur les dossiers? Pour sortir le 'lcd' de' initial_state', utilisez 'initial_state.lcd'. – ben

Répondre

19

Un motif d'enregistrement ressemble à un record:

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

Merci. Résolu mon problème. – yjasrc

+4

@yjasrc Dans OCaml moderne, vous pouvez également ignorer la partie '=' si vous nommez la variable de la même manière que le libellé: 'match s avec {lcd; vpr; _} -> print_int lcd; print_int vpr'. – lukstafi

+1

Pour ajouter au commentaire de luksatfi, il n'est pas non plus nécessaire d'avoir une instruction de correspondance. 'let print_state {lcd; vpr; _} = ... 'devrait suffire. – rgrinberg

Questions connexes