과제 이외의 명령형에 대한 형식 유추


10

명령형 언어의 유형 시스템에 관한 연구 논문에서 필자는 가변 참조가 있지만 복합 연산자, 루프 또는 조건부와 같은 명령형 제어 구조가없는 언어에 대한 솔루션 만 찾습니다.

따라서 http://rust-lang.org 와 같은 부분 형식 유추를 갖는 명령형 언어를 구현할 수있는 방법이 명확하지 않습니다 .

논문은 List of a매개 변수화 된 유형이 Hindley-Milner 유형 시스템의 사소한 확장이기 때문에 매개 변수화 된 유형에 대해서는 언급하지 않습니다 . 통일 알고리즘 만 확장되어야하며 나머지 추론은 그대로 작동합니다. 그러나 역설이 발생하므로 할당을 간단하게 추가 할 수 없으므로 ML 값 제한과 같은 특수 기술을 적용해야합니다.

명령형 루프, 조건부, IO 및 복합 명령문이있는 언어의 유형 시스템을 설명하는 논문이나 책을 추천 할 수 있습니까?


4
표준 ML에는 실제로 복합 연산자, 루프 및 조건부 (한 줄 예 :)가 있기 때문에 부분적으로 질문의 출처를 이해하지 못합니다 let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end. 따라서 연구 질문 수준에서 "가치 제한을 포함하여 Caml / SML에서 개발 된 기술을 적용하십시오"라는 답이 있습니까?
Rob Simmons

문제는 "Caml / SML을 위해 개발 된 기술에 대해 어떤 논문을 추천 하시겠습니까?"였습니다.
nponeccop

Ok-나는 그것을 알아 냈고, 마지막 문장을 편집하려고 시도했다. "ML에서 사용되는 Hindley-Milner 타입 추론에 대한 접근 가능한 참조를 찾고 있습니까?" 그리고 나는 5 분 편집 제한 :-) 히트
롭 시몬스

답변:


14

형식 유추에 대한 깔끔하고 기능적인 참조를 찾고 있다면 Gundry, McBride 및 McKinna의 2010 " Context in Type in Context "에 약간 부분적 이지만 실제 실제 구현에 대한 좋은 가이드는 아니지만 .

대답의 일부는 가치 제한을 넘어서 Hindley-Milner 유형 추론을 명령형 언어에 적용하는 데 큰 어려움이 없다는 것입니다. e1; e2구문 설탕으로 (fn _ => e2) e1정의 while e1 do e2하고 구문 설탕으로 정의 하면 규칙적인 whiledo e1 (fn () => e2)위치 whiledo는 어디 입니까? 재귀 함수

fun whiledo g f = if g then (f (); whiledo g f) else ();

형식 유추를 포함하여 모든 것이 잘 작동합니다 .

특별한 기술인 가치 제한에 관해서는 다음 이야기를 좋아합니다. Karl Crary에서 가져 왔을 것입니다. 값 제한으로 인해 ML로 작성하지 못하게하는 다음 코드를 고려하십시오.

let
   val x: 'a option ref = ref NONE
in
   (x := SOME 5; x := SOME "Hello")  
end

완전히 문제가없는 다음 코드와 비교해보십시오.

let
   val x: unit -> 'a option ref = fn () => ref NONE
in
   (x () := SOME 5; x () := SOME "Hello")  
end

그것은 포함하는 두 개의 새로운 심판 세포 생성 : 우리는 두 번째 예는 무엇을 알고 NONE, 다음 풋 SOME 5첫 번째 (AN에서를 int option ref) 다음 풋 SOME "Hello"두 번째 (A에서를 string option ref).

그러나 x시스템 F (다형성 람다 미적분)에서 어떻게 표현할 것인지에 대한 첫 번째 예를 생각해보십시오 . 이러한 설정에서 x유형의 값 "이 될 것입니다 그래서 수단은 용어로,의 값이 그 것을" 이어야합니다 (유형) 람다 : " ".α.심판(선택권(α))xΛα.심판[α](없음)

이것은 첫 번째 예제의 하나의 "좋은"동작이 두 번째 예제와 동일한 방식으로 작동하는 것입니다. 즉, 유형 수준 람다를 두 번 다른 인스턴스로 만듭니다. 우리가 인스턴스화 처음 x으로 int발생합니다, x [int]참조 세포 지주로 평가 NONE하고 SOME 5. 우리가 인스턴스화 두 번째 시간 x으로 string구분되며, x [string]A (로 평가하는 다른! ) 참조 셀 보유 NONE다음과 SOME "Hello". 이 동작은 "올바른"(유형 안전)이지만 프로그래머가 기대하지 않는 것이기 때문에 프로그래머가 예기치 않은 종류의 동작을 처리하지 않도록 ML에 값 제한이 있습니다.


1
desugared 버전의 e1; e2불일치 괄호와 세미콜론 (정의되어야 함)이 포함되어 있습니다. 당신은 의미 했습니까 (fn _ => e2) e1?
이토 쓰요시

오른쪽, 쓰요시 : 고정.
Rob Simmons

마지막 단락은 기본적으로 (작동) 시맨틱과 유형 시스템이 일치하지 않으며 하나를 수정해야하며 후자를 수정하기로 선택합니다.
Radu GRIGore

Radu : 물론 그 요약에 동의합니다.
Rob Simmons

3

Xavier Leroy의 박사 학위 논문 은 좋은 시작입니다.


1
이 논문은 명령형 루프, 조건부, IO 및 복합 문장을 다루지 않습니까? 내 질문의 주된 이유는 이러한 주제를 다루는 논문을 찾을 수 없었기 때문입니다. 과제를 타이핑하는 것에 관한 논문이 풍부합니다.
nponeccop

0

내 질문에 네크로 답변을해서 미안하지만 문제의 참조는

표준 ML에 대한 제안 , Milner, 1983

Part 6 "표준 파생 형식"은 명령 구조의 탈당을 상당히 광범위하게 다루고 있습니다. 그리고 지금까지 내가 찾을 수있는 이러한 명백한 변형에 대한 가장 빠른 참조입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.