- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我正确理解 Haskell 中的 ST monad,runST
以巧妙的方式使用 2 级类型,以确保计算在转义 monad 时不会引用任何其他线程。
我有一种带有 Hindley-Milner 类型系统的玩具语言,我的问题如下:是否可以使用用于键入 runST
应用程序的临时规则来扩展 HM 类型系统,以便ST monad 是可以安全逃脱的,无需引入 2 级类型?
更准确地说,runST
的类型为 forall s a。 ST s a -> a
(即,rank-1)并且类型规则将首先尝试以与 HM 在 let 表达式中概括类型相同的方式概括计算类型,但如果 s
类型变量被发现被绑定(bind)。
与 vanilla HM 相比,上述内容仅限制接受的程序,所以看起来不错,但我不确定。这行得通吗?
最佳答案
万一问题的评论不完全清楚,您需要的判断是
这当然与 Hindley-Milner 附带的其他常见打字判断结合起来。 。有趣的是,我们最终不需要为任何引入 ST
类型的东西制定特殊规则,因为这些都不需要等级 2 的类型签名:
newSTRef :: a -> ST s (STRef s a)
readSTRef :: STRef s a -> ST s a
writeSTRef :: STRef s a -> a -> ST s ()
...
关于haskell - 带有 Hindley-Milner 类型系统的 runST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39725024/
Control.Monad.ST在 base包装内含 runST运行严格的状态转换器 monad: runST :: (forall s. ST s a) -> a 但是,我需要 runST 的通用版
我有一个类型 [ST s (Int, [Int])] 的绑定(bind)我正在尝试申请runST使用映射到每个元素,如下所示: name :: [ST s (Int, [Int])] --Of Cou
我遇到过许多关于 RunST 的 Rank 2 类型以及它如何防止引用转义 RunST 的解释。但我不明白为什么这也会阻止以下代码进行类型检查(这是正确的,但我仍然想了解它是如何做到这一点的): te
为什么要进行类型检查: runST $ return $ True 虽然以下不是: runST . return $ True GHCI 提示: Couldn't match expected typ
ST monad ,最初由 Launchbury and Peyton Jones 设计, 允许 Haskell 程序员编写命令式代码(使用可变变量、数组等),同时获得该代码的纯接口(interfac
我有一个如下所示的测试函数,它使用 runST 在内部改变状态。我在其中定义了另一个函数 go ,它返回包裹在 ST 中的 Int 作为结果(只是玩一些 ST 概念)。问题是我的函数类型签名似乎是错误
我想要类似的东西 f :: [forall m. (Mutable v) (PrimState m) r -> m ()] -> v r -> v r -- illegal signature f g
当我尝试编译这个时: module Main where import qualified Data.Vector.Unboxed.Mutable as MV import Control.Monad
如果我正确理解 Haskell 中的 ST monad,runST 以巧妙的方式使用 2 级类型,以确保计算在转义 monad 时不会引用任何其他线程。 我有一种带有 Hindley-Milner 类
我是一名优秀的程序员,十分优秀!