#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 = [] # *rank-1多相 [#o6360e2c] 大堀先生が考案され、SML# に実装されている方法です。 [[SML#のrank-1多相:http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?FeatureRank1Polymorphism]] *rank-n多相 [#b781ac96] GHCはこれ。