Tại nơi làm việc, tôi được giao nhiệm vụ suy luận một số thông tin về ngôn ngữ động. Tôi viết lại các chuỗi các câu lệnh thành các let
biểu thức lồng nhau , như vậy:
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 }
Vì tôi bắt đầu từ thông tin loại chung và cố gắng suy luận các loại cụ thể hơn, nên lựa chọn tự nhiên là các loại sàng lọc. Ví dụ, toán tử có điều kiện trả về một tập hợp các loại nhánh đúng và sai của nó. Trong trường hợp đơn giản, nó hoạt động rất tốt.
Tôi đã gặp phải một trở ngại, tuy nhiên, khi cố gắng suy ra loại sau:
function g(f) {
var x;
x = f(3);
return f(x);
}
Được viết lại thành:
\f.
let x = undefined in
let x = f 3 in
f x
HM sẽ suy ra và do đó . Loại thực tế tôi muốn có thể suy ra là:
Tôi đã sử dụng các phụ thuộc chức năng để giải quyết loại +
toán tử quá tải , vì vậy tôi cho rằng đó là một lựa chọn tự nhiên để sử dụng chúng để giải quyết loại f
bên trong g
. Đó là, các loại f
trong tất cả các ứng dụng của nó cùng xác định duy nhất loại g
. Tuy nhiên, hóa ra, các quỹ không cho vay rất nhiều vào số lượng các loại nguồn khác nhau.
Dù sao, sự tương tác của đa hình và gõ tinh chế là vấn đề. Vì vậy, có một cách tiếp cận tốt hơn tôi đang thiếu? Tôi hiện đang tiêu hóa các loại sàng lọc của ML cho ML và sẽ đánh giá cao nhiều tài liệu hơn hoặc các gợi ý khác.