Hindley-Milner 알고리즘:사용 유형을 지키 바인딩은 적용
-
16-12-2019 - |
문제
나를 구현하는 들리-밀 유형 추정 알고리즘,다음과 같은 튜토리얼의 표시 존스 고 올 Kiselyov.이들 모두는"신청인"작업으로 유형을 거의 양식
applyBindings :: TyEnv -> Type -> Type
는 적용 tyvar -> ty
에서 바인딩 TyEnv
을 주어 Type
.나는 그것을 발견한 일반적인 실수는 나의 코드를 호출하는 것을 잊지 마십시오 applyBindings
, 도에 도움이 되지 않습니켈의 유형 시스템,이후 ty
는 동일한 유형으로 applyBindings tyenv ty
.내가 찾는 방법을 집행하는 다음과 같은 고정서에 형식 시스템:
을 할 때 유형추,바인딩을 적용해야 합니다 반환하기 전에'최종 결과
을 할 때 유형추를 위해 단형 개체어가는 자연적인 방법을 적용하므로,이 구현에서'렌 ng 튼의 통일-fd 패키지:우리는 두 가지 정의를 위한 데이터 형식 Type
s:
-- | Types not containing unification variables
type Type = ... -- (Fix TypeF) in wren's package
-- | Types possibly containing unification variables
type MutType = ... -- (MutTerm IntVar TypeF) in wren's package
고 applyBindings
유형
-- | Apply all bindings, returning Nothing if there are still free variables
-- otherwise just
applyBindings :: TyEnv -> MutType -> Maybe Type
(이 기능은 실제로 freeze . applyBindings
에서 통일-fd).을 적용합니다 우리의 invariant-는 경우에는 우리가 잊지 applyBindings
, 다음 우리는 것을 입력 오류가 있습니다.
이 솔루션의 종류 내가 찾는 것이지만,대체 언어와 다형성이다.위의 접근 방식 그대로,적용되지 않으므로,우리는 우리의 언어 형태도 유형 변수--실제로 있을 경우 변수를 무료 후에 적용 바인딩을,우리가 원하지 않을 돌아 Nothing
, 지만,우리는 우리가 원하는 일반화하는 이들 변수입니다.
솔루션은 라인을 따라 나는 설명하는,즉중 하나를 제공하는 applyBindings
다른 형식 const id
?실제 컴파일러를 사용하여 동일한 말장난(사이 통일을 변수 및 객체지 언어를 입력 변수)시고 올의습니까?
해결책
나 산토 도밍고,뿐만 아니라 어둠 속에서 여기에,내가 생각하기 때문에 있을 수 있습니다 다른 문제로 솔루션을 제안,그러나 내가 해결할 수 있는 적어도 하나의 어려움:
- 당신의 유형이 있어야 합 검사 다른 표현한 통합변수 유형 고 개체-언어 형 변수.
이는 변하지 않는 구현하기 어려운,그리고 사실 나는 생각 구현형 검사는 일은 이 방법으로,적어도 한 시간입니다.를 확인할 수 있습니지 실질적인 유형추를 위한 임의 순위를 유형;부록에 포함되는 많은 매우 유용 코드입니다.