使用 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 ()
...
如果我正确理解 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 ()
...