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

8.3 レコードパターン

レコードのフィールド取り出しは,パターンマッチングの機能を用いて も行うことができます. Standard MLには以下のパターンが含まれています.

pat  ::=
 | {field_list}
 | {field_list,...}
field  ::= l=pat|l

最初のパターンは指定されたフィールドからなるレコードにマッチするパ ターン,2番目のパターンは少なくとも指定されたフィールドを含むレコードに マッチするパターンです. フィールドはフィールド名のみ書くこともできます. その場合,フィールド名と同じ変数が指定されたものとみなされます. 以下は,レコードパターンを用いたフィールド取り出しの例です.

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

このレコードパターンは,他のパターンと自由に組み合わせて使用でき ます.

# fun f ({X,...}::_) = X;
val f = fn : [’a#{X: ’b}, ’b. ’a list -> ’b]

この例では,Xフィールドを含むレコードのリストの先頭のレコー ドのXフィールドの値を返しています.