是否有证据表明 runST 确实是纯净的?
Is there a proof that runST is indeed pure?
ST monad, originally devised by Launchbury and Peyton Jones 允许 Haskell 程序员编写命令式代码(带有可变变量、数组等),同时获得该代码的纯接口。
更具体地说,entry point function
的多态类型
runST :: (forall s. ST s a) -> a
确保包含 ST
计算的所有副作用,并且结果值是纯净的。
这有没有被严格(甚至正式)证明过?
这是 Andrea Vezzosi 的 Agda formalization,它证明 runST
对于具有 readable/writable refs 的 ST
monad 是安全和完整的。它依赖于假定的参数性,i。 e.所涉及定义的自由定理的真实性,正如预期的那样,因为参数性正是 forall s.
技巧起作用的原因。
但是,证明假设我们不能将值放入 STRef s
中,其类型本身依赖于 ST s
。在 Haskell 中,我们可以使用这种依赖性来实现无递归循环:
loop :: ()
loop = runST $ do
x <- newSTRef (pure ())
writeSTRef x $ do
y <- readSTRef x
y
y <- readSTRef x
y
可能这个版本的 ST monad 仍然是安全的,只是没有可证明的总 writeSTRef
和 readSTRef
.
恰好 Amin Timany 等人。最近在 POPL2018 上发表了一篇关于这个主题的论文。
您可以找到论文 here。
完全披露:我还没有找到时间自己仔细阅读它:)。
ST monad, originally devised by Launchbury and Peyton Jones 允许 Haskell 程序员编写命令式代码(带有可变变量、数组等),同时获得该代码的纯接口。
更具体地说,entry point function
的多态类型runST :: (forall s. ST s a) -> a
确保包含 ST
计算的所有副作用,并且结果值是纯净的。
这有没有被严格(甚至正式)证明过?
这是 Andrea Vezzosi 的 Agda formalization,它证明 runST
对于具有 readable/writable refs 的 ST
monad 是安全和完整的。它依赖于假定的参数性,i。 e.所涉及定义的自由定理的真实性,正如预期的那样,因为参数性正是 forall s.
技巧起作用的原因。
但是,证明假设我们不能将值放入 STRef s
中,其类型本身依赖于 ST s
。在 Haskell 中,我们可以使用这种依赖性来实现无递归循环:
loop :: ()
loop = runST $ do
x <- newSTRef (pure ())
writeSTRef x $ do
y <- readSTRef x
y
y <- readSTRef x
y
可能这个版本的 ST monad 仍然是安全的,只是没有可证明的总 writeSTRef
和 readSTRef
.
恰好 Amin Timany 等人。最近在 POPL2018 上发表了一篇关于这个主题的论文。 您可以找到论文 here。 完全披露:我还没有找到时间自己仔细阅读它:)。