OCamlやってみよう

まずは環境整備。
http://caml.inria.fr/download.en.html
から、「Self installer (3.09.3) for the port based on the Microsoft toolchain」とやらダウンロードしてきて実行。適当な所にインストール完了。なんかこれだけで随分GUIGUIした環境がセットアップされた。一応「C:\Program Files\Objective Caml\bin」とかにPATHを通しておく。コンパイラでほげほげするほどOCamlについてわかってはいないので、しばらく対話環境で遊ぶ。

どんな型があるのかチェック。

# 33;;
- : int = 33
# 2.34;;
- : float = 2.34
# true;;
- : bool = true
# 'a';;
- : char = 'a'
# "Hello World";;
- : string = "Hello World"

この辺はいつも通りのお馴染の型。これらの型を扱うような四則演算とか比較、入出力とか行う計算が定義されてるんだなあと予測がつきます。

# ();;
- : unit = ()

unit型とやら。unit型の値は()だけ、らしい。未だどういう場面で必要となるかわからないですけど、きっとなにかに使うのでしょう。

# (3, 2);;
- : int * int = (3, 2)
# ("太郎", 23, 180.0, 72.3);;
- : string * int * float * float = ("\145セ\152Y", 23, 180., 72.3)

組(tuple)というデータ構造。tuple型とも言われてるのかも。任意の型の値の積。離散数学の集合あたりの考え方をするとわかりやすいような。
"太郎"が化けてるのはとりあえず気にしない。

# [1; 2; 3;];;
- : int list = [1; 2; 3]
# [|1; 2; 3|];;
- : int array = [|1; 2; 3|]
# [|1; 2; 3;|];;
- : int array = [|1; 2; 3|]

リスト型と配列(array)型。最後のセミコロンはあっても無くても同じようだ。OCamlのリストはLISP的なリストで、頭から操作していく必要があるようだ。配列は添字でアクセスできるようなデータ。
SchemeのリストとvectorC++ STLのlistとarray、といった関係と似てるようだ。

# float_of_int 3;;
- : float = 3.
# float_of_int;;
- : int -> float = <fun>

int→floatの関数(fun)型と。

もうちょい複雑な型とかもあるっぽいけど、とりあえずパス。無くてもしばらく遊びプログラムは書けそう。

さて。とりあえずなんかプログラム書いてみよう。とりあえず階乗あたり。

# let rec fact = function x -> if(x=0) then 1 else (x * fact(x-1));;
val fact : int -> int = <fun>
# fact 3;;
- : int = 6
# fact 5;;
- : int = 120
# let rec f = function a -> function x -> if(x=0) then a else f (a*x) (x-1);;
val f : int -> int -> int = <fun>
# let fact = function x -> f 1 x;;
val fact : int -> int = <fun>
# fact 5;;
- : int = 120

SICPで言うところの再帰的プロセスと反復的プロセスな書き方をしたけど、違いが出るのかどうかは知らんなあ。

# (function x -> x+1) 3;;
- : int = 4
# ((function x -> x+1)) 3;;
- : int = 4

ふと思い付いて実行したらうまく動いた書き方。なるほど。括弧は数式と同じで、式の優先順位を決める以外に意味を持たないのかな?
やっぱりC言語よりかはSchemeに似てるかね。Schemeはじめた時同様、しばらくはシンタックスシュガーをいくらか我慢する方向性で。

test