형식 유추에 대한 깔끔하고 기능적인 참조를 찾고 있다면 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에 값 제한이 있습니다.
let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end
. 따라서 연구 질문 수준에서 "가치 제한을 포함하여 Caml / SML에서 개발 된 기술을 적용하십시오"라는 답이 있습니까?