ที่ทำงานฉันได้รับมอบหมายให้อนุมานข้อมูลบางประเภทเกี่ยวกับภาษาแบบไดนามิก ฉันเขียนลำดับของข้อความไปยัง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 }
เนื่องจากฉันเริ่มต้นจากข้อมูลประเภททั่วไปและพยายามอนุมานประเภทที่เฉพาะเจาะจงมากขึ้นตัวเลือกที่เป็นธรรมชาติคือประเภทการปรับแต่ง ตัวอย่างเช่นตัวดำเนินการตามเงื่อนไขส่งคืนการรวมของประเภทของสาขาที่เป็นจริงและเท็จ ในกรณีง่าย ๆ มันใช้งานได้ดีมาก
ฉันวิ่งเข้าไปในอุปสรรค์อย่างไรก็ตามเมื่อพยายามสรุปประเภทต่อไปนี้:
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 ไม่ได้ให้ยืมตัวเองอย่างดีเยี่ยมกับจำนวนตัวแปรประเภทแหล่งที่มา
อย่างไรก็ตามการทำงานร่วมกันของ polymorphism และการปรับแต่งการพิมพ์นั้นเป็นปัญหา ดังนั้นจะมีวิธีที่ดีกว่าฉันหายไป? ขณะนี้ฉันกำลังแยกย่อย "ประเภทการปรับแต่งสำหรับ ML" และจะขอบคุณวรรณกรรมเพิ่มเติมหรือตัวชี้อื่น ๆ