組・レコード・リスト

無理やり言えばC#のKeyValuePairみたいなものかな。任意の2つのデータを一つとして扱えます。

構文
  • (要素, 要素)
# (2.5, 3);;
- : float * int = (2.5, 3)
# (2.5, false);;
- : float * bool = (2.5, false)

レコード

よく考えればC#にはこんなデータ構造は無いかもしれない。(DataRowとか使えば別だが...)
複数の名前と値のペアを一つのレコードとして扱える。

構文
  • { 名前1 = 値1; 名前2 = 値2; ..... }

名前の事をフィールドというそうです。

まずレコードの型を定義します。

# type staff_t = {
    id : int;       (* ID *)
    name : string;  (* 名前 *)
    unit : string;  (* 部署 *)
    age : int;      (* 年齢 *
  };;
type staff_t = { id : int; name : string; unit : string; age : int; }

使います。省略すると怒られます。

# { id = 101; };;
Characters 0-13:
  { id = 101; };;
  ^^^^^^^^^^^^^
Error: Some record field labels are undefined: name unit age
# { id = 101; name = "test staff"; unit = "development"; age = 27 };;
- : staff_t = {id = 101; name = "test staff"; unit = "development"; age = 27}

リスト

任意の個数をもち、順番に並んだデータです。

定義
  • [] は空リスト
  • 『::』は『リストの先頭に要素を付け加える』という命令
  • リストの要素は全て同一の型である必要がある

上記を踏まえて、2種類の定義方法があります。

  • 要素1 :: 要素2 :: ... :: 要素n :: []
  • [要素1; 要素2; ... ; 要素n ]
# "one" :: "two" :: "three" :: "four" :: "five" :: [];;
- : string list = ["one"; "two"; "three"; "four"; "five"]

『::』の命令方法を考えると、ちゃんと書くとこう。

# "one" :: ("two" :: ("three" :: ("four" :: ("five" :: []))));;
- : string list = ["one"; "two"; "three"; "four"; "five"]

つまり『::』は『リスト以外の左辺 :: リストの右辺』にのみ有効ということ。
ということは、リストは自身であるリストを参照しなければ作る事ができないということ。
その為に空リストである『』が用意されている。
よって、『::』を使って作成するリストの最後の右辺は常に『
』なのである。(たぶん..)

それはさておき、もう一つの例

# ["one"; "two"; "three"; "four"; "five"];;
- : string list = ["one"; "two"; "three"; "four"; "five"]

結果を考えると、こっちのが書き方としては楽だし直感的な気がする。