プログラミング言語SML#解説 4.0.0版
9 SML#の拡張機能:その他の型の拡張

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

型変数をt,種々の型にインスタンス化ができない単相型をτ, 多相型をσで表すと,Standard ML言語の多相型はおおよそ以下のように 定義されるランク0と呼ばれる型です.

τ ::= t | b | ττ | τ*τ
σ ::= τ | (t1,,tn).τ

これに対して,SML#で推論可能な多相型は,多相型が関数の引 数の位置以外の位置にくることを許す以下のようなランク1と呼ばれる型です.

τ ::= t | b | ττ | τ*τ
σ ::= τ | (t1,,tn).τ | τσ | σ*σ

この拡張は,もともとレコード多相性の効率的な実現を目指した技術的 な拡張であり,純粋なMLの型理論の枠組みでは殆ど違いはありません. しかし,Standard MLの改訂版で導入された値多相性制約のもとでは, 重要な拡張となっています. 次節で値多相性とランク1多相性の関連を解説します.