プログラミング言語SML#解説 3.7.1版
8.4 フィールドの変更
SML#言語では,以下の構文によるレコードのフィールドの(関 数的)変更が定義されています.
# {=,, =} |
この構文は,レコード式の値をそれぞれ指定された値に変更して 得られるレコードを生成します. この構文は,常に新しいレコードを生成し,もとのレコードは変更され ません. この構文も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フィールドを 含む任意の従業員レコードに適用可能な,汎用の減額関数となっています.