レコード

レコードとはいくつかの値に名前を付けてまとめて扱えるようにしたデータ。構造体のようなもの。名前と値をあわせてフィールド,名前をフィールド名と呼ぶ。
新しいレコードの型を宣言するには type 宣言を使う。

 # type student = {name : string; id : int};;
 type student = { name : string; id : int; }

name と id がフィールド名でそれぞれの値の型が string と int だ。

レコードを作るには次のようにする。フィールドの順番は入れ替わってもok。

 # let st1 = {name = "Taro"; id = 123};;
 val st1 : student = {name = "Taro"; id = 123}
 # let st2 = {id = 51; name = "Ichiro"};;
 val st2 : student = {name = "Ichiro"; id = 51}

また,すでにあるレコードと一部だけが違うレコードを作る方法もある。

 # let st3 = {st1 with id = 456};;
 val st3 : student = {name = "Taro"; id = 456}

st1 のフィールドを書き換えるわけではないことに注意。

 # st1;;
 - : student = {name = "Taro"; id = 123}

レコードのフィールドを参照するにはドット記法が使える。

 # st2.name;;
 - : string = "Ichiro"
 # st2.id;;
 - : int = 51

また,パターンマッチングもできる。

 # let string_of_student {name = n; id = i} =
     n ^ "'s ID is " ^ string_of_int i
   ;;
 val string_of_student : student -> string = <fun>
 # string_of_student st2;;
 - : string = "Ichiro's ID is 51"

パターンにはすべてのフィールドを列挙する必要はなく,一部でもいい。

 # let name_of_student {name = n} = n ;;
 val name_of_student : student -> string = <fun>
 # name_of_student st1;;
 - : string = "Taro"