-
29-09-2020 - |
문제
나는 형식 시스템을 지원을 합니다.I 략적인 아이디어를 가지고있는 방법의 유형을 추정은 일반적으로 구현되는 시나리오,하지만 내가 궁금하는 방법-후 형식추가 완료-의 올바른 구현 과부는 연산자 선택할 수 있습니다.또는,다시 말해서,어떻게 추정형 전달할 수 있는 다시 아래로는 구문에 나무를 연산자입니다.
을 위한 작은 예로,표현 (x + y) + 1
가 x :: N | S, y :: a, + :: (N -> N -> N) | (S -> S -> S), 1 :: N
. ::
미 의 유형, 고 a | b
스탠드형 a
나 유형 b
.
그런데,나는 가정,형식추는 것이 지금 작업을 통과하는 구리,그리고 각 노드가 반환하는 입력 제약 조건:
(x + y) + 1 => ((N & (N[a=N] | S[a=S])), (N & N) -> N) | ((S & (N[a=N] | S[a=S])), (S & N) -> S) => N[a=N]
1 => N
+ => (N -> N -> N) | (S -> S -> S)
x + y => ((N & (N | S)), (N & a) -> N) | ((S & (N | S)), (S & a) -> S) => N[a=N] | S[a=S]
x => N | S
y => a
+ => (N -> N -> N) | (S -> S -> S)
a & b
이 예제에서는 스탠드 통합 유형 a
고 b
, [a=T, b=U]
의 평등에 대한 제약 조건을 입력 변수입니다.
예상대로 반환한 유형의 주어진 식이로 유추 N[a=N]
, 는 N
는 형 변수 a
이 될 것으로 예상 N
.
따라서,두 개의에서 제공한 구현에 대해 +
운전자(N -> N -> N
, S -> S -> S
), N -> N -> N
을 사용해야 합니다.주어진 예제에서,그 결과 유형을 유추하지만,형식의 오버로드 연산자입니다.나의 질문이 있을 경우 일반적인 패턴을 알리는 데 사용됩 +
노드 구문에 나무의 구현합니다.
해결책
수 구성하는 형식추는 다음과 같습니다.
가정의 입문이 있 유형 Input
.정의 구문을 출력 Output
수처 Input
하지만 명시적으로 주석 유형에 모든 변수입니다.형식추가 유형
infer : Input -> List (Output * Type)
즉 주어진 어떤 입력 e
,그것의 목록을 반환합니다.각각의 대답은 쌍 (e', t)
가 e'
가 e
변수가 주석에 의한 형식 t
는 유추한 종류의 e
.
당신이 볼 수 있습니다 이것으로 모든 맡에 nondeterminism 냅니다.필요할 때마다 추론하는 변수의 형식 x
, 에,당신은 그것의 가능한 유형 S | T | ...
고지점에서는 각각 그 중 하나입니다.이 방법은 당신이하지 않아도를 통과"뒤로"어떤 정보를 sub-식입니다.대신에,각 하위 식는 이미 주석에,가능한 모든 방법이다.