我想更好地理解例如Data.Map的实习生.当我在Map中插入一个新的绑定时,由于数据的不变性,我得到一个与旧数据结构加上新绑定相同的新数据结构.
我想了解这是如何实现的.编译器最终是通过使用数百万个绑定复制整个数据结构来实现的吗?通常可以说可变数据结构/数组(例如Data.Judy)或命令式编程语言在这种情况下表现更好吗?在字典/键值存储方面,不可变数据是否具有任何优势?
ehi*_*ird 31
Map建立在树数据结构上.基本上,新的Map值被构造,但它会与指针的几乎完全充满旧结构.由于Haskell中的值永远不会改变,因此这是一种安全且非常重要的优化,称为共享.
这意味着您可以使用相同数据结构的许多相似版本,但只有树的不同分支才会重新存储; 其余的只是指向分支原始副本的指针.而且,当然,如果你扔掉旧的Map你,树枝做的改变将被垃圾回收器回收.
共享是不可变数据结构性能的关键.您可能会发现这篇维基百科文章很有用; 它有一些启发性图表,显示修改后的数据如何通过共享来表示.
Data.Map不复制旧地图; 它(懒惰地)分配O(log N)个新节点,这些节点指向(从而共享)大部分旧地图.
因为"更新"地图不会破坏旧版本,所以这种数据结构为您提供了构建并发算法的更大自由.