İş yerinde dinamik bir dil hakkında bazı tür bilgiler çıkarmakla görevlendirildim. let
İfade dizilerini iç içe ifadelere yeniden yazar , şöyle:
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 }
Genel tip bilgisinden başladığımdan ve daha spesifik türler çıkarmaya çalıştığımdan, doğal seçim arıtma türleridir. Örneğin, koşullu işleç, doğru ve yanlış dallarının türlerinin birliğini döndürür. Basit durumlarda, çok iyi çalışır.
Ancak, aşağıdakilerin türünü çıkarmaya çalışırken bir engelle karşılaştım:
function g(f) {
var x;
x = f(3);
return f(x);
}
Hangi yeniden yazılır:
\f.
let x = undefined in
let x = f 3 in
f x
Ben zaten aşırı yüklenmiş bir +
operatörün türünü çözmek için fonksiyonel bağımlılıklar kullanıyorum , bu yüzden f
içinde türünü çözmek için kullanmak için doğal bir seçim olduğunu düşündüm g
. Yani, f
tüm uygulamalarındaki türleri birlikte türünü benzersiz bir şekilde belirler g
. Ancak, ortaya çıktığı gibi, fundeps değişken kaynak türlerine çok iyi borç vermez.
Her neyse, polimorfizm ve arıtma yazımının etkileşimi sorunludur. Yani kaçırdığım daha iyi bir yaklaşım var mı? Şu anda “ML için Arıtma Türleri” ni hazmediyorum ve daha fazla literatür veya diğer göstergeleri takdir ediyorum.