是否有证据表明runST确实是纯粹的?

时间:2017-04-23 19:39:21

标签: haskell semantics proof st-monad

最初由ST monad设计的Launchbury and Peyton Jones允许Haskell程序员编写命令式代码(使用可变变量,数组等),同时获得该代码的纯接口。

更具体地说,entry point function

的多态类型
runST :: (forall s. ST s a) -> a

确保包含ST计算的所有副作用,并且结果值是纯的。

这是否经过严格(甚至正式)证明?

2 个答案:

答案 0 :(得分:12)

以下是Andrea Vezzosi的Agda formalization,证明runST对于具有可读/可写参考的ST monad来说是安全的和完全的。它依赖于假定的参数,i。即所涉及的定义的自由定理的真实性,正如预期的那样,因为参数性正是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仍然是安全的,只是没有可证明的总writeSTRefreadSTRef

答案 1 :(得分:6)

恰好Amin Timany等人。最近在POPL2018上发表了一篇关于这个主题的论文。 你可以找到论文here。 完全披露:我还没有找到时间彻底阅读它:)。

相关问题