如果我正确理解 Haskell 中的 ST monad,runST
请以巧妙的方式使用 rank-2 类型,以确保在转义 monad 时计算不会引用任何其他线程。
我有一个带有 Hindley-Milner 类型系统的玩具语言,我的问题如下:是否可以使用用于键入应用程序的临时规则扩展 HM 类型系统,runST
以便 ST monad 可以安全地逃避,而无需引入等级-2 种?
更准确地说,runST
将具有类型forall s a. ST s a -> a
(即 rank-1)并且类型化规则将首先尝试以与 HM 在 let 表达式中泛化类型相同的方式泛化计算类型,但如果s
发现类型变量被绑定,则会引发类型错误.
与香草 HM 相比,上述内容仅限制了可接受的程序,所以看起来不错,但我不确定。这行得通吗?