7-1. 型検査と型推論の概要

前節までは、プログラム(式)をどのように評価するか、ということを学んだ。 作成した評価器(インタープリタ)は、OCaml と似たような振舞いをするように 設計したが、重大な違いの1つが、型の整合性をチェックしない点である。 このため、(fun x -> x + 1) true のように、実行するまでもなくエラーである ことがわかる式も、処理系は真面目に計算をしてしまい、実行時エラーとなる。 OCaml でこの式を実行しようとすると、コンパイル時の「型推論」により エラーであることがわかり、早期にディバッグができる。 本節(およびそれ以降)では、このための基本となる事項を学ぶ。 現代のプログラミング言語の多くは、強力な型システムをもっている。 そして、OCaml や C, C++, Java, SML, Haskell, F# などの言語に共通する特徴は, 静的な型システムをもっていて、さらに、言語処理系が静的に(コンパイル時 に)型の整 合性をチェックしてくれることである。 (ちなみに,Scheme/Lisp, Ruby, Perl, JavaScript などのプログラム言語は, 動的な型システムを持っている.「動的」というのは, 型の整合性のチェックは実行時に(動的に)行われるということである.)

OCaml でプログラミングをした経験のある人は既にわかっているように, 型の整合性の検査は非常にありがたく,プログラミング上の小さなエラーはこ の検査によって,かなりの程度発見される.この「ありがたみ」がどのような 技術によって生み出されているかを見るのが本節の目的である.

本論にはいる前に,型検査と型推論という言葉について整理しておこう. C 言語では,変数の型をプログラム中に明示するので,型の整合性を検査する だけでよい.これは,型検査と呼ばれる. 一方,OCamlでは,変数の型をプログラム中に明示しなくてよいので(明示して もよい),不明な型を推論しつつ整合性を検査することになる.これは型推論 という. 一般に、型推論の方が型検査より難しい課題である。

本実験では、型検査と型推論の基礎となる事項を学ぶ。 OCaml の処理系には、型推論システムが備わっているが、 本実験では、型検査システムの作成までを必修課題とし、 型推論システムについては発展課題とする。

OCamlでの型の整合性

OCaml の処理系が、どのような式を型が合う(整 合的に型を付けられる)と判断しているかは、 式を、OCaml処理系に入力してみればわかることである。 しかしながら、型が合わなかった場合にOCaml処理系から出力される エラーメッセージはよくわからないものであることが多いので、 どのような場合に型が合うかを系統的に理解しておくことには、意義がある。 ここでは、いくつかの例で説明する。
トップ, 前へ. 次へ.

亀山 幸義