不可变性以及参考透明度导致一些理想的属性。但它们共同存在两个缺点:
这两项操作都很昂贵。
结构共享减轻了第一个问题。 List
类型是最简单的持久数据结构之一,并且由于结构共享在列表之前是相当便宜的:
xs = [1, 2, 3] -- [1, [2, [3, []]]]
ys = 0 : xs -- [0, [1, [2, [3, []]]]]
但是如何在不检查每个元素的相等性的情况下确定xs
和ys
之间的相等性?
在像Javascript这样的命令式语言中,我只需对根节点进行物理等式检查。由于这会使引用透明性无效,当然在Haskell中是不可能的。
是否存在避免暴力方法的方法/策略 - 至少在某些情况下?
我目前在Javascript中尝试的是创建一个实现monad类的相等类型,这样我就可以确定引用相等而不会丢失RT。但我太缺乏经验,不知道这是否是一种很有前途的方法。