(* 処理対象となる式の型の定義 *) type exp = | IntLit of int | BoolLit of bool | Plus of exp * exp | If of exp * exp * exp次に、これから作成する型検査システムでは、「ミニOCaml言語の式の型」をデータとし て扱う必要があるので、そのためのデータ型 ty を以下のように定義する。
(* 「型」をあらわす型の定義 *) type ty = TInt | TBoolここで TInt と TBoll はそれぞれ「ミニ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 関数を読んでエラーとしている。
type exp = ... | Eq of exp * exp (* 上記の定義に、Eq を追加 *)
亀山 幸義