如何测试 Haskell 个对象的引用相等性?

How to test Haskell objects for reference equality?

在Haskell中,等式测试通常使用Eqclass之后的==进行。这个函数(在大多数情况下)是在纯粹的 Haskell 术语下定义的,因此它遵循将它递归应用于大数据结构的所有结果。因此,看似微不足道的比较可能会花费大量时间。加油,这应该是即时的(偷懒提醒):

ghci> let x = [1..100000000] in x == x
True
(2.81 secs, 14,400,130,800 bytes)

这里为什么Haskell不使用引用比较?如果我真的想要,Haskell 是否允许我这样做?

简短回答:不,这在 Haskell 中是不可能的,并且有充分的理由。引用相等性是语言设计的一个基本部分,保留它使得 Haskell 在语言设计 space.

中与许多其他语言不同

稍微长一点的答案:这是一个 well-studied 主题,通常称为可观察共享,至少可以追溯到 2000 年代初期:

  • Claessen 和 Sands 解释了 Observable Sharing 在哪些情况下有用,以及如何将其合并到语言中。这是一篇非常容易阅读的论文,它详细解释了这个问题并建议 non-conservative 扩展。有助于理解基本问题。

  • Gill 对这个问题的解决方案是一种在实践中使用的非常可行的方法,称为 type-safe observable sharing. The idea here is that you can create equalities in pure code, but you can only observe them in the monadic IO context; which preserves referential equality. It has no false negatives, and very few false positives. There is also an implementation of this idea on hackage,您可以轻松使用。

长话短说:不,你不能做 referential-equality,或 pointer-equality,或直接观察 Haskell 中的共享,这是有充分理由的。这个问题得到了很好的研究和理解,并且有实用的解决方案来解决 Haskell 生态系统中的问题而不破坏参照透明性。