说我有

{-# LANGUAGE GADTs #-}

import Unsafe.Coerce

data Any where
    Any :: a -> Any

type Index = Int

newtype Ref a = Ref Index

mkRef :: a -> Index -> (Any, Ref a)
mkRef x idx = (Any x, Ref idx)

(any0, ref0) = mkRef "hello" 0
(any1, ref1) = mkRef 'x' 1
(any2, ref2) = mkRef (666 :: Int) 2

anys :: [Any]
anys = [any0, any1, any2]

derefFrom :: Ref a -> [Any] -> a
(Ref idx) `derefFrom` pool = case pool !! idx of
    Any x -> unsafeCoerce x

如果我只使用带有适当构造参数的 derefFrom,这段代码会按预期工作吗?看起来是这样,但我不知道可能有什么问题。

通过适当构造的参数,我的意思是:
ref0 `derefFrom` anys
ref1 `derefFrom` anys
ref2 `derefFrom` anys

(我将通过将 mkRef 的使用封装在 monad 中以确保 Ref 使用相应的列表正确生成,从而使其更安全。)

最佳答案

是的;只要你能确定 unsafeCoerce 只会被调用来强制一个实际上是目标类型的值,那么它就是安全的。

关于haskell - 安全使用来自 GADT 存在的 unsafeCoerce?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21612213/

10-15 19:18