プログラミング言語SML#解説 4.0.0版
8 SML#の拡張機能:レコード多相性

8.1 レコード構文

MLではレコード式は以下の文法で定義します.

expr  ::=
 | {l1=expr1,, ln=exprn}

lはラベルと呼ぶ文字列です. レコードの定義の簡単な例を示します.

# val point = {X = 0.0, Y = 0.0};
val point = {X = 0.0, Y = 0.0} : {X: real, Y: real}

1から始まる連続した数字をラベルとして持つレコードは,組み型と解 釈され組として表示されます.

# {1 = 1.1, 2 = fn x => x + 1, 3 = "SML#"};
val it = (1.1, fn, "SML#") : real * (int -> int) * string
# (1, 2);
val it = (1, 2) : int * int

以前第7.8節で説明した複数引数の 関数はpowerUncurry (n, C)のように定義しましたが,これも 数字をラベルとしたレコードの受け取ることを表しています.

「式は型が正しい限り自由に組み合わせることができる」というMLの 原則に従い,レコードの要素にはMLで定義できる任意の型を含むことができま す. 従って,レコードを生成する関数に対しても,リストの場合と同様に多 相型が推論されます.

# fun f x y = {X = x, Y = y};
val f = fn : [’a. ’a -> [’b. ’b -> {X: ’a, Y: ’b}]]
# fun g x y = (x, y);
val g = fn : [’a. ’a -> [’b. ’b -> ’a * ’b]]