このたび、OCamlに入門いたしました。
OCamlとは"Object Caml"の略で言葉通り、「オブジェクト指向なCaml」です。Camlとは(英語で『ラクダ』ですが)、プログラミング言語の一種でMLという関数型言語の方言として作られた言語です。
つまりOCamlも関数型言語です。
OCamlはとくに有名な機能として、「強力な型推論」があります。型推論とは、「変数や関数の型を自動的に判別する」機能で、C/C++やJavaなどの言語で
int x; float y; int func(){ return 0; }
といったような変数や関数の型の宣言を行いますが、OCamlではそのような宣言をせずとも、勝手にコンパイラが型を判断してくれます。
OCamlで変数を宣言する場合は"let"を用いて
let a = 1;;
のように書きます。これで束縛される値が『 1 』であることからコンパイラが「変数 a は整数型である」、と判断してくれます。そのため、他の言語と異なり、整数型と浮動小数点数型をそのまま同じ計算の中に組み込むことはできません。(ちなみに式の終了には";;"をつけます)
let a = 1;; let b = 1.;; a + b;;
上のようなプログラムを実行すると
>Characters 2-3: > a+b;; > ^ >Error: This expression has type float but is here used with type int
のように「aとbの型が異なっているので計算できない」という趣旨のエラーが発生します。
また、実際に浮動小数点数型同士の計算をする場合にも注意が必要です。他の言語ではよく
float x = 1. + 1.;
などと整数型のときの演算子(+,-,*,/)と同じ演算子を用いて計算しますが、OCamlでは浮動小数点数型では整数型のときの演算子の後ろに"."をつけた演算子(+.,-.,*.,/.)を用います。
let a = 1. +. 1.;;
これで変数 a に『 2. 』が束縛されます。
関数の宣言も変数の宣言と同じく"let"を用います。
let plusOne x = x + 1;;
関数名が"plusOne"、引数が"x"、関数の値が"x+1"である関数を宣言しました。ちなみに型推論によって"+1"のところが整数型であるため、引数の型も関数の型も整数型と判断されます。つまりこの関数は整数に対してしか用いることができません。
plusOne 1;; > - : int = 2
(通常、コンパイラシェルでは行頭に"#"が付いていますが、入力と出力の区別がつきやすいように出力部分のみ">"をつけています。)
さて、では整数と浮動小数点数の計算をしたくなった時は諦めるしかないのかというとそうではありません。
型変換をすることで、ちゃんと行えます。
float_of_int 1 >1. int_of_float 1. 1
のように"float_of_int"で整数型から浮動小数点数型へ、"int_of_float"で浮動小数点数型から整数型への変換が可能です。
今回は、変数、関数の宣言と整数、浮動小数点数の他言語との違いを書いてみました。次はOCamlの基本型について書いてみたいと思います。