2013-06-18 109 views
10

我正在嘗試使用模式匹配來編寫計算器應用程序。Ocaml中的記錄類型模式匹配

兩種主要類型的定義如下:

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

但是,如果我有這樣的狀態:

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

然後,當我調用該函數:

print_state initial_state;; 

它將有編譯錯誤。任何人都可以知道編譯失敗的原因。謝謝。

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中,如果您以與標籤相同的方式命名變量,則也可以跳過'='部分:'match s with {lcd; VPR; _} - > print_int lcd; print_int vpr'。 – lukstafi

+1

要添加到luksatfi的評論,它也沒有必要有一個匹配聲明。 '讓print_state {lcd; VPR; _} = ...'應該夠了。 – rgrinberg