TaPLの22章までで紹介してきた規則だと、単相になる。なるが、以下のようになってしまう。定義通り、異なる文脈では異なる型として扱えていない。シンプルなアイディアとしてxにt1を代入することで多相性を持たせるというものがあり、これをlet多相と呼ぶらしい。代入による方式だと、let束縛項の出現のたびにlet束縛の右辺全体が検査されることになってしまい効率が悪い。これを解決するために以下のようにする。eのような宣言があったら、eの型を推論して、「決まらなかった」部分は「何でもよい」と解釈し、具体化されなかった型変数について∀を先頭を追加する。http://d.hatena.ne.jp/sumii/20061028/1162000645プログラムのサイズに対して最悪指数関数的になるが、基本的には線形であり、単純な代入形式より実用的になる。副作用のある場合のlet多相と値制限TaPLの例をそのまま持ってくる。x);(!r)true);上で紹介した実用的な実装だと、この式を評価するとsuccをtrueに適用する、となってしまいおかしくなる評価規則を変更してrをそのままその定義に置き換えると問題ないが、1つ目と2つ目は別の参照を指すことになってしまい、よくわからない意味論になってしまう。これの問題を解決するために「右辺が構文的に値であるときのみ、let束縛は多相に扱える」というアプローチをWrightが導入し、この制約を値制限という。この制約があっても実用上は大きな問題がない、とTaPLでは紹介されている。