レコード

レコード

前回は、内部構造を持つデータとして「組」というのをやった。
以下のような形で記述することで、hogeのとった点数は80であるというデータを表す。

("hoge", 80)

ただ、これだと常に(名前, 点数)の順番、要素の数を守らないといけないのと
単純にデータはただ並んでいるだけです。


名前が何なのか、とか、その人は何点とったのかという様に
それぞれのデータが何を表しているのかを明確にするためには
レコードを使用して、データに名前を付けて管理する。


レコードの書式

{ 名前1 =1 ; 名前2 =2 ; ......}

※名前1,名前2をフィールドと呼ぶ。


といっても、レコードを使う場合には、自分で型を定義し、使用するフィールドを宣言しないといけない。
新しい型の定義は

type 定義する型の名前 = { 型の定義 }


具体的には以下のような形で表す。

(* 生徒1人分のデータを表す型 *)
type student = {
  name   : string;    (* 名前 *)
  score  : int;       (* 点数 *)
  result : string;    (* 成績 *)
}

※フィールド名(ここでは、name/score/result)は他のレコードのフィールド名も含めて重複できない。

レコードの要素を取り出す

組と同様にレコードの要素を取り出す場合にもmatch文を使う。


復習:match文

match1 with
  パターン ->2


レコードの場合、パターンは以下の形式

{ フィールド1 = パターン変数1 ; フィールド2 = パターン変数2 ; .....}


上で作ったstudent型のレコードから、成績を通知する関数は以下の様になる。

let notice student = match student with
  { name = n ; result = r } -> 
    n ^ "さんの成績は" ^ r ^ "です。" 

※レコードの要素を取り出す時のパターンでは、不要なフィールドを省略できる。