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

8.4 フィールドの変更

SML#言語では,以下の構文によるレコードのフィールドの(関 数的)変更が定義されています.

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

この構文は,レコード式exprの値をそれぞれ指定された値に変更して 得られるレコードを生成します. この構文は,常に新しいレコードを生成し,もとのレコードは変更され ません. この構文もMLの型の原則に従いレコード多相性を持ちます. 以下は,この構文含む関数の例とその型推論の例です.

# fun f modify x = modify # {X = x};
val f = fn : [’a#{X: ’b}, ’b. ’a -> ’b -> ’a]

この構文とレコードパターンを組み合わせた以下の形の関数は,レコー ドを扱うプログラムでよく登場するイディオムと言えます.

# fun reStructure (p as {Salary,...}) = p # {Salary = Salary * (1.0 - 0.0803)};
val reStructure = fn : [’a#{Salary: real}. ’a -> ’a]

関数reStructureは,従業員レコードpを受け取り,その Salaryフィールドを8.03%減額する関数です. 型情報から理解されるとおり,この関数は,Salaryフィールドを 含む任意の従業員レコードに適用可能な,汎用の減額関数となっています.