Ch.8 SML#の拡張機能:レコード多相性

§ 8.4. フィールドの変更

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

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

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

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

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

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

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