let多相には色々と種類があるので、ちと注意が必要です。

値制限のlet多相 †

参照型と型安全を両立させるため、let多相を値に制限する方法。 TAPLでも紹介されています。値制限は、かなーり厳しい。

# let fst (x, _) = x;;
val fst : 'a * 'b -> 'a = <fun>
# let v = fst ([], ());;
val v : '_a list = []
# 

fst ([], ()) は値ではなく、関数適用なので、多相にはならない。

OCamlのlet多相 &dagger;

OCamlのlet多相には基本的に値制限が付いています。 ただし、型変数がcovariantな位置に現れる場合は、subtype関係から多相が回復します。

garrigue先生の論文

# let fst (x, _) = x;;
val fst : 'a * 'b -> 'a = <fun>
# let v = fst ([], ());;
val v : 'a list = []
# 

rank-1多相 &dagger;

大堀先生が考案され、SML# に実装されている方法です。

SML#のrank-1多相

rank-n多相 &dagger;

GHCはこれ。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS