• 追加された行はこの色です。
  • 削除された行はこの色です。
#comment

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

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

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

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

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

[[garrigue先生の論文:http://www.math.nagoya-u.ac.jp/~garrigue/papers/morepoly-long.pdf]]

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

covariantな位置というのは、(不正確ですが)関数の型を表す→の右側と思ってください。
つまり例えば、関数の戻り値に型変数があるなら、それはcovariantな位置の型変数です。
正確には圏論的に言うと(以下略

*rank-1多相 [#o6360e2c]
大堀先生が考案され、SML# に実装されている方法です。

[[SML#のrank-1多相:http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?FeatureRank1Polymorphism]]

*rank-n多相 [#b781ac96]
GHCはこれ。
-[注意]
Haskellのrank-n多相とかの話は、let多相の話ではなく、Universal Quantifiers (System Fとか)の話なので混同しないように。私はおもいっきり勘違いしていました(泣

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