【发布时间】:2012-11-28 16:34:43
【问题描述】:
我想实现一个在 Haskell 中使用的双向连接边列表数据结构。该数据结构用于管理平面中线排列的拓扑结构,并包含面、边和顶点的结构。
在我看来,这个数据结构的一个好的接口应该是 Arrangement 类型,具有类似的功能
overlay :: Arrangement -> Arrangement -> Arrangement
但通常的实现很大程度上依赖于引用(例如,每个面都有对相邻边的引用)。
在我看来,理想的工作方式类似于可变和不可变数组的工作方式:Arrangement 数据结构的内部实现为函数数据结构,但改变排列的操作“解冻”它们以在 monad 中创建新的可变实例(理想情况下使用 COW 魔法来提高效率)。
所以我的问题是:
(1) 有没有办法像数组一样冻结和解冻一个小堆? (2) 如果没有,有没有更好的方法?
【问题讨论】:
-
我猜你对通常的打结技巧不感兴趣,而是对更底层的东西感兴趣。
-
我有兴趣在 Haskell 中创建类似的数据结构。我理解的唯一两种方法是使用打结方法,这种方法非常优雅但修改效率低下,或者使用基于 ID 的方法和地图类型数据结构(间接),从优雅的角度来看似乎并不令人满意,但是可能效果很好。如果您有不同的想法,我想听听更多。
-
您看过 Martin Erwig 的函数图库吗? (web.engr.oregonstate.edu/~erwig/fgl/haskell)
-
我刚刚阅读了描述 FGL 的论文,这似乎是一种有趣的方法。我不认为我可以直接使用 FGL,但也许我可以以同样的方式实现我的图表。谢谢你!
-
你可以只使用数组作为通用引用来实现你的结构吗?
标签: haskell data-structures reference mutable freeze-thaw