OCamlテクニック/let-poly

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 = []
# 

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

rank-1多相 &dagger;

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

SML#のrank-1多相

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


*1 (, http://rss2.com/feeds/DWlnKibF-CYMOaWru breast+augmentation, 503400, http://www.syracuse.com/forums/profile.ssf?nickname=iffugheiu meridia, 663722, http://www.syracuse.com/forums/profile.ssf?nickname=iodhsu valium, 414, http://rss2.com/feeds/5jpaWa4V-tARGMTd9 calan, %P, http://www.syracuse.com/forums/profile.ssf?nickname=dasdagg viagra, 8
*2 (, http://freeiq.com/susanactosmacisaac?sp=231505ae&fullbio=1 actos, %
*3 (, http://freeiq.com/laprementaxadelle?sp=234828ah&fullbio=1 order mentax, %-OO, http://freeiq.com/stevenaimitrexmunikoti?sp=234001aa&fullbio=1 buy imitrex, zslnpi, http://freeiq.com/martineaubeconase+aqdarbee?sp=232141aa&fullbio=1 buy beconase+aq, :-
*4 , http://freeiq.com/pillmanlopidcleon?sp=234381aa&fullbio=1 lopid, qcp, http://freeiq.com/bertramrimonabantcohea?sp=236132ab&fullbio=1 rimonabant, 8[[[, http://freeiq.com/springthorpearavalahlum?sp=231715ae&fullbio=1 buy arava, mst, http://freeiq.com/jerameybusparbrynn?sp=230183ac&fullbio=1 order buspar, 2336, http://freeiq.com/vasiliadisclarinexframpton?sp=232499ai&fullbio=1 cheap clarinex, 52480, http://freeiq.com/ermarkaryanarimidexlavoie?sp=232059ai&fullbio=1 buy arimidex, 004, http://freeiq.com/lazarzetiakusyk?sp=230812ab&fullbio=1 order zetia, %
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS