如果我正确理解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相比,所以看起来很合理,但我不确定。这会有用吗?
答案 0 :(得分:2)
如果对问题的评论不完全清楚,你需要的判断是
这当然与Hindley-Milner附带的其他通常的打字判断相结合。有趣的是,我们最终不需要为引入 x is not None
类型的任何内容制定特殊规则,因为这些都不需要等级2的类型签名:
ST