Joa*_*ner 12 haskell proof st-monad semantics
最初由Launchbury和Peyton Jones设计的ST monad允许Haskell程序员编写命令式代码(使用可变变量,数组等),同时获得该代码的纯接口.
更具体地说,入口点函数的多态类型
runST :: (forall s. ST s a) -> a
Run Code Online (Sandbox Code Playgroud)
确保ST包含计算的所有副作用,并且结果值是纯的.
这是否经过严格(甚至正式)证明?
And*_*ács 13
这是Andrea Vezzosi 的Agda形式化,证明runST对于ST具有可读/可写参考的单子来说是安全的和完全的.它依赖于假定的参数性,即所涉及定义的自由定理的真实性,这是预期的,因为参数性正是该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
Run Code Online (Sandbox Code Playgroud)
也许这个版本的ST单子仍是安全的,根本就没有可证明的总writeSTRef和readSTRef.