我想学习如何在Haskell中制作图并对其执行一些本地操作,但是问题不是特定于Haskell的,我们可以考虑使用双链表来代替图。
问题:用 主要支持和倡导不可变数据结构(Haskell,Clojure等)的语言,惯用或推荐的方式来实现双链表(或其他双链或循环数据结构)及其操作。 ?特别是,如何使用语言正式禁止的就地更新?
我很容易想到,如果对双向链接列表执行某些本地操作(例如,如果插入了一个项目),由于语言的惰性,可能不需要立即复制整个列表。但是,由于列表是双重链接的,因此如果在一个地方进行修改,则旧节点都不能在列表的新版本中使用,因此,迟早需要对它们进行标记,复制和垃圾收集。显然,如果仅使用列表的更新副本,则这些操作是多余的,但是它们会增加与列表大小成比例的“开销”。
这是否意味着对于此类任务,不可变数据根本不合适,并且对可变数据没有“本地”支持的功能性声明语言不如命令式语言那么好?还是有一些棘手的解决方法?
附言:我已经在互联网上找到了一些有关该主题的文章和演示,但是很难追踪它们,而我认为这个问题的答案不应该超过一个段落或者是一个图表...我的意思是,如果有对于此问题,没有“功能性”解决方案,答案可能是“使用C”。如果有一个,那么它有多复杂?
相关问题
“函数式编程中的数据结构”。此处没有讨论我有关使用就地更新而不是效率低下的替代方案的具体问题。
“持久性数据结构的内部变异”。那里的重点似乎是用一种未指定的语言进行的低级实现,而我的问题是关于一种语言(功能语言或其他功能)的正确选择以及功能语言的可能惯用的解决方案。
相关报价
纯粹的函数式编程语言允许非常简洁地表达许多算法,但是在少数算法中,就地可更新状态似乎起着至关重要的作用。对于这些算法,缺乏可更新状态的纯功能语言似乎固有地效率低下([Ponder,McGeer and Ng,1988])。
-约翰·劳伯伯里(John Launchbury)和西蒙·佩顿·琼斯(Simon Peyton Jones),《懒惰的功能状态线程》(1994),还有约翰·劳伯伯里和西蒙·佩顿·琼斯,《哈斯克尔州》(1995)。这些论文ST
在Haskell中介绍了Monadic类型构造函数。