我的理解是,没有字段的类型的构造函数是“静态分配”和GHC shares these between all uses,而GC will not move these。
如果这是正确的,那么我希望在False
和Nothing
等值上使用reallyUnsafePtrEquality#
非常安全(没有误报或肯定),因为它们只能表示为指向该构造函数的单个实例的相同指针。
我的推理是否正确?是否有任何潜在的问题或理由怀疑在不久的GHC版本中这可能会变得不安全?
答案 0 :(得分:12)
我实际上设法让reallyUnsafePtrEquality
做错了。
这是我的最小代码示例
{-# LANGUAGE MagicHash #-}
import GHC.Prim
-- Package it up nicely
ptrCmp :: a -> a -> Bool
ptrCmp a b = case (reallyUnsafePtrEquality# a b) of
0# -> False
1# -> True
main = do
b <- readLn
let a = if b then Nothing else Just ()
a' = Nothing
print $ a == a' -- Normal
print $ ptrCmp a a' -- Evil
做一些像
这样的事情 $ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.8.2
$ ghc unsafe.hs
$ ./unsafe
True
True
False
所以......是的,reallyUnsafePtrEquality
仍然是邪恶的。