使用 Hindley-Milner 类型系统的 runST

runST with Hindley-Milner type system

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

我有一种带有 Hindley-Milner 类型系统的玩具语言,我的问题如下:是否可以使用用于输入 runST 应用程序的临时规则来扩展 HM 类型系统,以便ST monad 可以安全地转义,无需引入 rank-2 类型?

更准确地说,runST 将具有类型 forall s a. ST s a -> a(即 rank-1),并且类型化规则将首先尝试以与 HM 概括 let 表达式中的类型相同的方式概括计算类型,但如果发现绑定了 s 类型变量,则会引发类型错误。

与香草 HM 相比,以上仅限制了可接受的程序,因此看起来不错,但我不确定。这行得通吗?

以防万一问题的评论不完全清楚,你需要的判断是

这当然与 Hindley-Milner 附带的其他常用打字判断结合使用。有趣的是,我们最终不需要为任何 引入 一个 ST 类型制定特殊规则,因为其中 none 需要等级 2 的类型签名:

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