在Haskell中,相等性测试通常使用
为什么 Haskell 这里不使用引用比较?如果我确实想这样做,Haskell 是否允许我这样做呢?
==
来自Eq
类来执行。 这个函数(在大多数情况下)是在纯Haskell术语下定义的,因此它遵循将其递归应用于大型数据结构的所有后果。 因此,一个看似微不足道的比较可能需要相当长的时间。 意识到惰性,这应该是即时的:ghci> let x = [1..100000000] in x == x
True
(2.81 secs, 14,400,130,800 bytes)
为什么 Haskell 这里不使用引用比较?如果我确实想这样做,Haskell 是否允许我这样做呢?
xs = [1, 2, 3]
和ys = id xs
,然后稍后我问xs == ys
,如果==
意味着指针比较,那么根据ys
是否被评估,我会得到不同的结果。如果这是可观察的,那么我们需要仔细定义 何时 可以进行评估,以便我们可以确保评估xs == ys
的结果是可预测的。这基本上迫使我们成为一种命令式语言,其中代码作为一系列步骤,而不是“无时间”的表达式语言。此外,它排除了许多编译器优化。 - BenreallyUnsafePtrEquality#
和以下其他问题感兴趣:https://dev59.com/fWkw5IYBdhLWcg3wyNgV,https://dev59.com/emIk5IYBdhLWcg3wWs9z,https://stackoverflow.com/q/30175974,https://stackoverflow.com/q/48163259。 - Taylor Fausak