Functional programming 函数式编程:不变的数据结构效率

Functional programming 函数式编程:不变的数据结构效率,functional-programming,Functional Programming,我不明白FP编译器是如何使处理不可变数据结构的代码变得快速,而不是炸毁堆栈等 例如,在树中插入操作,它必须在添加新节点之前复制整个树并返回复制的树,而命令式couterpart只需要添加指向新节点的指针。如果insert操作运行数百万次,它将占用大量内存,并且当树变大时,复制将越来越慢。FP编译器实际上是如何优化这一点的?看一看。您不必复制整个树来进行更改;您可以共享大部分结构。例如,请参阅Clojure中的图表或Rich Hickey在Clojure上的图表(请参阅关于散列尝试的讨论)。编译器

我不明白FP编译器是如何使处理不可变数据结构的代码变得快速,而不是炸毁堆栈等


例如,在树中插入操作,它必须在添加新节点之前复制整个树并返回复制的树,而命令式couterpart只需要添加指向新节点的指针。如果insert操作运行数百万次,它将占用大量内存,并且当树变大时,复制将越来越慢。FP编译器实际上是如何优化这一点的?

看一看。

您不必复制整个树来进行更改;您可以共享大部分结构。例如,请参阅Clojure中的图表或Rich Hickey在Clojure上的图表(请参阅关于散列尝试的讨论)。编译器不会对此进行真正的优化,您必须在编写代码时专门为其编程。优秀的纯功能数据结构(,)中解释了执行此操作的技术。

如果垃圾收集器正在执行其工作,则数据结构的旧副本将在不再使用时被回收。

我可以问一下,为什么要否决此答案吗?假设我想通过一些修改来移动相同的集合,并保持其功能,知道GC将收集那些不再使用的部分,这会不会有帮助?它不会以任何方式回答这个问题。Diagram博客链接已失效,如果你能找到另一个链接,请更新你的答案,谢谢!