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

§ 8.2. フィールド取り出し演算

レコードに対する演算は,レコードのフィールドの取り出しです. このために,組み込み関数

#l

が用意されています. この関数はラベルlを含むレコードを受け取り,そのラベルのフィー ルドの値を返す関数です. MLの多相型の原則に従えば,この関数は,ラベルlを含む任意のレコー ド型からそのフィールドの値の型への関数です. SML#では,以下のような型が推論されます.

# #X;
val it = _ : ['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 y);
val f = _ : ['a#{X:'b,Y:ć},'b, 'c. 'a -> 'b * 'c]

この関数は,引数に対してXYのフィールド取り出しが行 われているため,引数は少なくともこれら2つのフィールドを含むレコードでな ければなりません. SML#が推論する型は,その性質を正確に反映した最も一般的な 多相型です.