2013-06-18 20 views
10

パターンマッチングを使用して電卓アプリケーションを作成しようとしています。Ocamlのレコードタイプパターンマッチング

2つの主要なタイプは、以下のように定義:

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

しかし、私のような状態がある場合:

print_state initial_state;; 

それは以下となります。そして、

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

を私は機能を呼び出すときコンパイルエラーがあります。誰でもコンパイルに失敗した理由を知ることができます。ありがとうございました。

Error: Syntax error 
unexpected token "(" 
+1

しかし、なぜあなたは、パターン記録に一致していますか? 'initial_state'から' lcd'を取得するには、 'initial_state.lcd'を使います。 – ben

答えて

19

記録パターンを記録するようになっています

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

ありがとうございます。私の問題を解決しました。 – yjasrc

+4

@yjasrc現代のOCamlでは、ラベルと同じ方法で変数に名前を付けると、 '='部分をスキップすることもできます: 'sと{lcd; vpr; _} - > print_int lcd; print_int vpr'。 – lukstafi

+1

luksatfiのコメントに追加するには、必ずしも一致ステートメントを持つ必要はありません。 'let print_state {lcd; vpr; _} = ... 'で十分です。 – rgrinberg