2013-06-18 2 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();; 

그러나, 나는이 같은 상태에있는 경우 :

print_state initial_state;; 

그것은 것 : 그런 다음

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

을 내가 함수를 호출 할 때 컴파일 오류가 있습니다. 누구든지 컴파일 실패의 이유를 알 수 있습니다. 덕분에 adv.

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의 덧글에 추가하려면 match 문을 전혀 사용할 필요가 없습니다. 'let print_state {lcd; vpr; _} = ...'충분해야합니다. – rgrinberg