7-2.単純な式に対する型検査

最初に、ミニOCaml言語の式の構文を(もう1度)限定して、 整数定数,真理値定数,足し算,if-then-else だけを持つ式だけとし、 これに対する型検査を考える。 式をあらわす型 exp は次のように定義される。
(* 処理対象となる式の型の定義 *)
type exp =
  | IntLit of int
  | BoolLit of bool
  | Plus of exp * exp 
  | If of exp * exp * exp 
次に、これから作成する型検査システムでは、「ミニOCaml言語の式の型」をデータとし て扱う必要があるので、そのためのデータ型 ty を以下のように定義する。
(* 「型」をあらわす型の定義 *)
type ty = TInt | TBool
ここで TInt と TBool はそれぞれ「ミニOCaml言語の整数型」と「ミニOCaml 言語の真偽値型」をあらわす。これらは、データ構成子であり、 OCaml の型である int や bool をそのまま使ってはいけない。

ここまで準備ができたら、型検査器 tcheck1 を一気に書いてしまおう。 tcheck1 は exp型のデータ(式) を受けとり、ty型のデータ(「型」を意味するデー タ)を返す関数である。

(* tcheck1 : exp -> ty *)
let rec tcheck1 e =
  match e with
  | IntLit(_)    -> TInt
  | BoolLit(_)   -> TBool
  | Plus(e1,e2)  -> 
      begin
        match (tcheck1 e1, tcheck1 e2) with
          (TInt,TInt) -> TInt
        | _ -> failwith "type error in Plus"
      end
  | If(e1,e2,e3) -> 
      begin
        match (tcheck1 e1, tcheck1 e2, tcheck1 e3) with
          (TBool,TInt,TInt) -> TInt
        | (TBool,TBool,TBool) -> TBool
        | _ -> failwith "type error in IF"
      end
  | _ -> failwith "unknown expression"
プログラムを見てわかるように、型が整合しない式を与えたときは、 failwith 関数を読んでエラーとしている。

課題 7-2.


トップ, 前へ. 次へ.

亀山 幸義