OCaml超入門
某大学課題でOCamlを使うことになったので導入から簡単な文法まで
OCamlとは
強い静的型付け言語です。Oが大文字ぐらいには知識がありますよね?
導入
Ubuntu環境ではOCamlと入力したらいけそう。OSXだとこちらの記事を参照。
$ brew install rlwrap
$ echo 'alias ocaml="rlwrap ocaml"' >> ~/.bashrc
こうするとctrl + l
でコンソールをクリアできたりして便利に使えるようになる。
文法
すでにプログラミング言語を1つ以上知っている方を想定します。おそらくそのプログラミング言語と(大きく)異なる点は
イコールの処理
OCamlではイコールひとつで真偽値判定をします。たとえばif n = 0 then A else B
という形をしています。
整数と浮動小数点数についての演算子の違い
浮動小数点数同士の演算では+
や/
の代わりに+.
や/.
を使います。ただしイコールはどちらも=
です。
否定
OCamlでは否定はnot A
で表します。
関数の宣言
無名関数の宣言は
fun x -> x * x;;
のようにすればよいです。これをf
という名前の関数にしたいのであれば
let f = fun x -> x * x;;
とすればよいですね。実際f 10
は100
を返します。
名前をつけたいのであれば最初から
let f x = x * x;;
とするのが簡単ですね。この内部構造が上記のように展開されていると考えたらよさげです。
関数型言語(というかラムダ計算)の特性ですが,関数も値と考えるのですべて定義はlet
を用います。let
で宣言された変数には再代入ができません。
部分適用
Schemeなどと違ってOCamlでは関数の部分適用が可能です。
たとえば
let f x y = x + y;;
としましょう。これは
let f = fun x y -> x + y;;
と等価であり,さらに
let f = fun x -> fun y -> x + y;;
と等価です。
ここで
let g = f 100;;
としますと,g
は引数を1つもち,その引数に100を加えた数を返す関数となります。
もともとのf
の第一引数に100が入ったと考えてください。
リスト
関連するものとしてタプルがあります。タプルに関しては省略するので各自お調べください。
リストでは同じ型をもつ複数の要素をまとめます。連結リストです。
let list = [1; 2; 3];;
のように各要素を;
で区切って宣言されます。先頭に付け加えたいときは
0 :: list;;
としてあげればよく,2つのリストを連結させたいときは
list @ [4; 5];;
としてあげます。
パターンマッチ
すごく面白いのですが書くと長くなるのでここをご参照ください。
再帰関数の書き方
ひとつ具体例をあげましょう。
0からnまでの整数の和を返す関数sum_to n
は次のように書かれます。
let rec sum_to n = if n = 0 then 0 else n + sum_to (n-1);;
注意すべきは以下の点でしょう。
- 再帰関数の定義は
let rec
とする。 -
;;
でステートメントが評価される。 - 基本的に引数に括弧は不要。
sum_to n-1
は(sum_to n)-1
を指すので注意。