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