【发布时间】:2011-10-02 05:15:40
【问题描述】:
是否有特定于 GHC 的“不安全”扩展来询问两个 Haskell 引用是否指向同一位置?
我知道如果使用不当,这可能会破坏参考透明度。但是,如果非常小心地使用它作为一种通过捷径递归(或昂贵)数据遍历进行优化的手段,应该不会有什么危害(除非我遗漏了什么),例如用于实现优化的Eq 实例,例如:
instance Eq ComplexTree where
a == b = (a `unsafeSameRef` b) || (a `deepCompare` b)
如果unsafeSameRef 决定为真,则提供deepCompare 保证为真(但不一定反过来)。
EDIT/PS:感谢指向System.Mem.StableName 的答案,我还能够找到Stretching the storage manager: weak pointers and stable names in Haskell 的论文,它恰好在10 多年前就已经解决了这个问题。 .
【问题讨论】:
-
我经常想要这个功能,正是为了这个目的:更快的相等性检查。
-
@FUZxxl:如果他问这个问题(并且问题清楚地表明他知道他在说什么),那么显然他需要那个。在不知道他的问题的情况下指责 OP 执行过早的优化有点……为时过早。
-
@Roman Cheplyaka:对不起。我不想评论太粗鲁,所以我删除了它。
-
+1 对于完美提出的问题。但是,我相信编译器会自动为我做这个优化。不是吗?
-
@Tarrasch:不,有很多理由不这样做。特别是,正如 Lennart Augustsson 在他的回应中指出的那样,平等并不完全是自反的。