使用Hindley-Milner类型系统运行runST

时间:2016-09-27 12:43:02

标签: haskell monads hindley-milner

如果我正确理解Haskell中的ST monad,runST会以巧妙的方式使用rank-2类型,以确保计算在转义monad时不引用任何其他线程。

我有一个带有Hindley-Milner类型系统的玩具语言,我的问题如下:是否可以使用ad-hoc规则扩展HM类型系统,以便键入runST个应用程序,以便ST monad安全无法逃脱,没有引入Rank-2类型?

更确切地说,runST将具有类型forall s a. ST s a -> a(即rank-1),并且输入规则将首先尝试以与HM在let-expressions中概括类型相同的方式来推广计算类型,但是如果发现s类型变量被绑定,则引发类型错误。

以上仅限于接受的程序与香草HM相比,所以看起来很合理,但我不确定。这会有用吗?

1 个答案:

答案 0 :(得分: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附带的其他通常的打字判断相结合。有趣的是,我们最终不需要为引入 x is not None类型的任何内容制定特殊规则,因为这些都不需要等级2的类型签名:

ST