基于不可变数据结构的应用程序不会耗尽内存吗?

oli*_*ren 4 out-of-memory immutability ramda.js immutable.js

没关系redux或其他东西 - 我只是询问Immutable.JS,Ramda等.

如果通过结构共享创建数据结构的新版本,则意味着每个新版本都需要具有指向先前版本的指针,以便它能够共享任何内容.这再次意味着结构的旧版本不能被垃圾收集,这意味着,在具有状态的应用程序中,此状态将使用单调增加的内存量.如果是这种情况,那么该数据结构在某些时候将使用所有可用内存,如果它不断被修改.

我在这里错过了什么吗?我可以看到,对于Web上的许多(大多数)用例(在浏览器中),这不会是一个问题,因为您可能每次只更改结构的一小部分,并且您可能会离开页面或者在使用所有内存之前重新加载它,但对于长时间运行的进程,这应该会产生问题.对?Riiight?

Bas*_*tch 5

如果通过结构共享创建数据结构的新版本,则意味着每个新版本都需要具有指向先前版本的指针,以便它能够共享任何内容.

这一般不正确.新版本将指向前一版本的部分.所以,是一个分数(通常几乎是旧版本的所有数据).

例如,Ocaml的地图(由红黑树的一些自平衡二进制搜索树变体表示实现)是不可变的:请参阅Map的文档.但是,如果您向地图添加(或删除)某些绑定,则会获得一个地图,该地图与旧内部节点共享大部分(但不是全部)内部节点.

因此垃圾收集器最终将"删除"那些与当前"状态"无关的内部节点.

BTW网络编程(和网络导航)与延续延续传递风格有关.参见例如Byrd的带有连续性Web编程C.Queinnec的几篇论文.

阅读有关函数式编程中monad的更多信息.