직장에서 나는 동적 언어에 대한 몇 가지 유형 정보를 유추하는 임무를 맡았습니다. 다음 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
HM은 및 결과적으로 . 유추 할 수있는 실제 유형은 다음과 같습니다.
이미 오버로드 된 +연산자 의 유형을 확인하기 위해 기능적 종속성 을 사용하고 있으므로 fwithin 의 유형을 해결하기 위해이를 사용하는 것이 당연한 선택이라고 생각했습니다 g. 즉, f모든 애플리케이션에서 유형이 함께 유형을 고유하게 결정합니다 g. 그러나 자금 기반은 다양한 유형의 소스 유형에 적합하지 않습니다.
어쨌든 다형성과 정제 타이핑의 상호 작용은 문제가된다. 그래서 내가 누락 된 더 나은 접근법이 있습니까? 저는 현재 "ML의 정제 유형"을 소화하고 있으며 더 많은 문헌이나 다른 조언을 부탁드립니다.