職場では、動的言語に関する型情報を推論する必要があります。次のように、ステートメントのシーケンスをネストされたlet
式に書き換えます。
return x; Z => x
var x; Z => let x = undefined in Z
x = y; Z => let x = y in Z
if x then T else F; Z => if x then { T; Z } else { F; Z }
一般的なタイプ情報から始めて、より具体的なタイプを推測しようとしているので、自然な選択は絞り込みタイプです。たとえば、条件演算子は、trueブランチとfalseブランチの型の和集合を返します。単純なケースでは、非常にうまく機能します。
ただし、次のタイプを推測しようとしたときに、思わぬ障害に遭遇しました。
function g(f) {
var x;
x = f(3);
return f(x);
}
これは次のように書き直されます。
\f.
let x = undefined in
let x = f 3 in
f x
オーバーロードされた+
演算子のタイプを解決するために関数の依存関係をすでに使用しているので、それらを使用してf
内のタイプを解決するのが自然な選択であると思いましたg
。つまりf
、すべてのアプリケーションののタイプが一緒になって、のタイプを一意に決定しg
ます。しかし、結局のところ、fundepsは、さまざまな数のソースタイプにあまり適していません。
とにかく、ポリモーフィズムと改良型付けの相互作用には問題があります。それで、私が見逃しているより良いアプローチはありますか?私は現在「MLの絞り込みタイプ」を消化しており、より多くの文献やその他の指針をいただければ幸いです。