(* 処理対象となる式の型の定義 *)
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
(**************************
(* 2010/10/13 13:33 修正; 以下はミスタイプでした。
* | BooltLit(_) -> TBool
*)
| BoolLit(_) -> TBool
| Plus(e1,e2) ->
(match (tcheck1 e1, tcheck1 e2) with
(TInt,TInt) -> TInt
| _ -> failwith "type error in Plus")
| If(e1,e2,e3) ->
(match (tcheck1 e1, tcheck1 e2, tcheck1 e3) with
(TBool,TInt,TInt) -> TInt
| (TBool,TBool,TBool) -> TBool
| _ -> failwith "type error in IF")
| _ -> failwith "unknown expression"
プログラムを見てわかるように、型が整合しない式を与えたときは、
failwith 関数を読んでエラーとしている。
type exp = ... | Eq of exp * exp (* 上記の定義に、Eq を追加 *)
亀山 幸義