プログラミング言語SML#解説 4.1.0版
8.2 フィールド取り出し演算
レコードに対する演算は,レコードのフィールドの取り出しです. このために,組み込み関数
#
が用意されています. この関数はラベルを含むレコードを受け取り,そのラベルのフィー ルドの値を返す関数です. MLの多相型の原則に従えば,この関数は,ラベルを含む任意のレコー ド型からそのフィールドの値の型への関数です. SML#では,以下のような型が推論されます.
# #X;
val it = fn : [’a#{X: ’b}, ’b. ’a -> ’b]
表現’a#{X:’b}は,型が’bのフィールドXを含む任意のレ コード型を代表する型変数です. 従って,推論された型は,Xを含む任意のレコードを受け取り, Xのフィールドの値を返す関数を表しており,#Xの動作を正確に 表現しています. この関数の適用例を以下に示します.
# #X {X = 1.1, Y = 2.2}
val it = 1.1 : real
これら演算を含む関数に対しては,レコードに関する多相型が推論され ます.
# fun f x = (#X x, #Y x);
val f = fn : [’a#{X: ’b, Y: ’c}, ’b, ’c. ’a -> ’b * ’c]
この関数は,引数に対してXとYのフィールド取り出しが行 われているため,引数は少なくともこれら2つのフィールドを含むレコードでな ければなりません. SML#が推論する型は,その性質を正確に反映した最も一般的な 多相型です.