gpt4 book ai didi

haskell - runST 的这种概括安全吗?

转载 作者:行者123 更新时间:2023-12-04 03:37:35 26 4
gpt4 key购买 nike

Control.Monad.STbase包装内含 runST运行严格的状态转换器 monad:

runST :: (forall s. ST s a) -> a

但是,我需要 runST 的通用版本:
runSTCont :: (forall s . (forall b . ST s b -> b) -> a) -> a
runSTCont f = f $ \m -> runST $ unsafeCoerce m

我的问题是:这是使用 unsafeCoerse安全的?
(我猜是这样,因为据我了解,索引 s 的唯一目的是防止在结果 s 中泄漏 a -indexed 值。 runSTCont 的类型不能泄漏 s -indexed值,所以应该没问题。)

请注意 runST可以用 runSTCont 表示所以 runSTCont至少与 runST 一样普遍:
runST' :: (forall s. ST s a) -> a 
runST' m = runSTCont $ \runST -> runST m

最佳答案

我不这么认为:

crash = runSTCont crasher where
crasher :: forall s. (forall b . ST s b -> b) -> Integer
crasher go =
let r :: forall a. STRef s (a -> a)
r = go $ newSTRef id
in go $ do writeSTRef r (tail . tail)
f <- readSTRef r
return $ f (17 :: Integer)

问题是 Haskell 缺乏值限制。

关于haskell - runST 的这种概括安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24724245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com