OCamlの型推論

変数への代入の際、CやJavaでは明示的に型を指定しないといけません。OCaml(おそらくML全般)には型推論という機能があって、型を明示しなくても自動的に(勝手に)変数にぴったりの型を当てはめてくれます。Objective-Cにはid型といういわば「なんでもあり型」によって実行時に型を推測してくれますが、OCamlではコンパイル時に型推論が行われ、暗黙のキャスティングは行われませんし、演算子もその型専用のものを使う必要があります。

たとえばOCamlで以下のようにレコードを作ってみます。

# type foo = {x:int; y:float};;

type foo = { x : int; y : float; }

# {x=1; y=5.5};;

- : foo = {x = 1; y = 5.5}

1行目でxという名前のintとyという名前のfloatの値を持つfoo型の宣言を行います。2行目はその実行結果。3行目でxとyにそれぞれint値とfloat値を代入したレコードを作ると、「xというint型・yというfloat型」の情報からfoo型だと言うことを推論します。変数名と型の両者が必要だというのが以下の例から分かります。

# type bar = {a: int; b: int; c: int};;

type bar = { a : int; b : int; c : int; }

# {a=3; b=4; z=6};;

Unbound record field label z

# {a=3; b=4; c=6.0};;

This expression has type float but is here used with type int

# {a=3; b=4; c=6};;

- : bar = {a = 3; b = 4; c = 6}