数据稳定名称 a
稳定名称具有以下属性:如果sn1 :: StableName和sn2 :: StableName和sn1 == sn2,则通过在同一对象上调用makeStableName创建sn1和sn2.
反过来不一定如此:如果两个稳定名称不相等,那么它们命名的对象可能仍然相等.
reallyUnsafePtrEquality# :: a - > a - > Int#
reallyUnsafePtrEquality#返回GHC堆上的两个对象是否是同一个对象.它真的不安全,因为垃圾收集器会移动东西,闭包等.据我所知,它可以返回假阴性(它说两个对象不一样,但它们都是),但不是误报(说它们当他们不是时,他们会一样.
他们两个似乎做了同样的基本事情:他们可以告诉你两个对象是否绝对相同,但不是它们是否绝对不是.
我能看到的StableNames的优点是:
我可以在reallyUnsafePtrEquality#中看到的优点:
我的问题是:
我错过了什么吗?
是否有任何用例,StableNames与他们命名的对象分开是有利的?
是否比另一个更准确(不太可能返回假阴性)?
如果你不需要散列,不关心可移植性,并且不会被使用名为reallyUnsafe的东西所困扰,是否有理由更喜欢StableNames而不是reallyUnsafePtrEquality#?