プログラミング言語SML#解説 4.0.0版
9.1 ランク1多相性
Standard MLの多相型システムが推論できる多相型は,すべての多相型 変数が最も外側で束縛される型です. 例えば関数
fun f x y = (x, y)
に対しては,
val f = fn : [’a, ’b. ’a -> ’b -> ’a * ’b]
の型が推論されます. SML#では,このような関数に対して以下のようなネストした多 相型を推論可能に拡張しています.
# fun f x y = (x, y);
val f = fn : [’a. ’a -> [’b. ’b -> ’a * ’b]]
この型は,’aとしてある型を受け取って多相関数 [’b. ’b -> * ’b]を返す関数型です. 実際,以下のような動作をします.
# f 1;
val it = fn : [’b. ’b -> int * ’b]
# it "ML";
val it = (1, "ML") : int * string
型変数を,種々の型にインスタンス化ができない単相型を, 多相型をで表すと,Standard ML言語の多相型はおおよそ以下のように 定義されるランク0と呼ばれる型です.
これに対して,SML#で推論可能な多相型は,多相型が関数の引 数の位置以外の位置にくることを許す以下のようなランク1と呼ばれる型です.
この拡張は,もともとレコード多相性の効率的な実現を目指した技術的 な拡張であり,純粋なMLの型理論の枠組みでは殆ど違いはありません. しかし,Standard MLの改訂版で導入された値多相性制約のもとでは, 重要な拡張となっています. 次節で値多相性とランク1多相性の関連を解説します.