2016-09-27 2 views
9

하스켈의 ST 모나드를 올바르게 이해하면 runST은 모나를 벗어날 때 연산이 다른 스레드를 참조하지 않도록하기 위해 순위 2 유형을 영리하게 사용합니다.Hindley-Milner 유형 시스템이있는 runST

나는 Hindley-Milner 타입 시스템을 사용하는 장난감 언어를 가지고 있는데, 나의 질문은 다음과 같다 : ST 모나드가 안전하게 동작 할 수 있도록 runST 어플 리케이션 타이핑 ad-hoc 규칙으로 HM 타입 시스템을 확장 할 수 있는가? 탈출 가능, 순위 2 유형을 도입하지 않고 ? 더 정확하게

, runST 유형 forall s a. ST s a -> a있을 것입니다 (즉, 순위-1) 먼저 HM은하자 표현식의 유형을 일반화 같은 방법으로 계산 유형을 일반화하지만, 경우에 유형 오류를 발생하려고 할 타이핑 규칙 s 유형 변수가 바인딩 된 것으로 확인되었습니다.

위의 내용은 바닐라 HM과 비교했을 때 허용되는 프로그램을 제한하므로 소리가 들리지만 확실하지 않습니다. 이게 효과가 있니? 질문에 대한 의견이 완전히 명확하지 않다 이런 경우에

+6

예, 당신이로'runST'를 추가 할 수 흥미롭게도, 우리는 이들 중 아무도 이후 순위 2 종류의 서명이 필요,ST 유형을 도입 아무것도 에 대한 특별 규정을 만들 필요가 끝나지 않는다 필요한 수표를하는 특별한 타이핑 규칙. – augustss

+0

고마워요 :-) – max

+0

'a'에 's'변수가 있는지 확인해야합니다. 그렇지 않으면 상태가 모나드 외부로 유출 될 수 있습니다. – max

답변

2

는 당신이 필요로하는 것이라고 판단

{\Gamma \vdash e \colon \forall s.\, {\tt ST}\, s\, a ~~~~ s \not\in \text{free}(a)\over \Gamma \vdash {\tt runST}\, e \colon a} ~~\text{[runST]}

Hindley-Milner와 함께 제공되는 다른 일반적인 타이핑 판단과 함께 물론이다.

newSTRef :: a -> ST s (STRef s a) 
readSTRef :: STRef s a -> ST s a 
writeSTRef :: STRef s a -> a -> ST s() 
...