reallyUnsafePtrEquality#在没有字段的构造函数上

时间:2014-07-06 18:38:04

标签: haskell ghc

我的理解是,没有字段的类型的构造函数是“静态分配”和GHC shares these between all uses,而GC will not move these

如果这是正确的,那么我希望在FalseNothing等值上使用reallyUnsafePtrEquality#非常安全(没有误报或肯定),因为它们只能表示为指向该构造函数的单个实例的相同指针。

我的推理是否正确?是否有任何潜在的问题或理由怀疑在不久的GHC版本中这可能会变得不安全?

1 个答案:

答案 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仍然是邪恶的。