GHC在调用Eq之前是否比较指针?

Fil*_*und 1 comparison haskell

从2014 年开始在邮件列表上的这个条目似乎表明答案是否定的.如果它仍然没有,我怎么能快速比较两个巨大的数据结构,其中一个是另一个的完全匹配,或稍微改变的版本?

Ale*_*lec 6

不,不是的.Eq是一个类似于任何其他的类型类,因此x == x(反身法)是用户强制执行的指南 - 而不是编译器强制执行的指南.正如评论中所建议的那样,您可以实现以下实例Eq,比较指针实际上是不正确的(因为这样做有时可能会返回True).

data NeverEqual = NeverEqual

instance Eq NeverEqual where
  _ == _ = False
Run Code Online (Sandbox Code Playgroud)

不安全的东西,请不要使用它 - 但是,它存在:

也就是说,有一些非常有限的情况,其中一个人确实想要做你的建议.你几乎可以在其他地方放弃性能,而我要提到的这个功能将打破引用透明度.

对于这些情况,有reallyUnsafePtrEquality# :: a -> a -> Int#一个比较相同类型的两个盒装值的指针,1#当它们相等时返回0#.参见unordered-containerscontainers使用例如.

  • 我不认为`reallyUnsafePtrEquality`的用例"非常有限" - 我认为你可以在许多想要提高相等性检查性能的地方使用它.只要你理解关于假阴性的警告; 然而,它绝不会给出误报,所以它非常安全.从我可以告诉GHC文档也是错误的; 它返回"#1"表示相等,"#0"表示不相等 (2认同)