基于不可变数据结构 运行 的应用程序不会内存不足吗?
Won't an app based on immutable data structures run out of memory?
别管 redux 什么的——我只是问 Immutable.JS、Ramda 等
如果数据结构的新版本是通过结构共享创建的,这意味着每个新版本都需要有一个指向以前版本的指针,以便它能够共享任何东西。这再次意味着旧版本的结构无法被垃圾回收,再次意味着,在您拥有状态的应用程序中,该状态将使用单调增加的内存量。如果是这种情况,那么该数据结构将在某个时候用完所有可用内存,如果它不断被修改的话。
我是不是漏掉了什么?我可以看到对于 Web 上的许多(大多数)用例(在浏览器中),这不会成为问题,因为您可能每次都只是更改结构的一小部分,并且您可能会离开页面或者在使用所有内存之前重新加载它,但是对于长时间的 运行 进程,这应该会造成问题。正确的?还好吗?
If new versions of a data structure is created by structural sharing, that means that every new version needs to have a pointer to the previous version in order for it to be able to share anything.
这在一般情况下是不正确的。新版本将有指向先前版本的 子部分 的指针。所以它共享一个分数(
通常 几乎 旧版本的数据。
例如,Ocaml 的地图 (represented and implemented by some self-balancing binary search tree variant of red-black trees) are immutable: see documentation of Map。但是如果你添加(或删除)一些绑定到(从)地图,你会得到一个 new 地图共享大多数(但不是全部)其内部节点与旧节点。
所以垃圾收集器最终会"delete"那些旧与当前"state"无关的内部节点。
BTW 网络编程(和网络导航)与 continuations and continuation-passing style. See e.g. Byrd's Web Programming with Continuations and several papers by C.Queinnec 有关。
另请阅读有关函数式编程中 monads 的更多信息。
别管 redux 什么的——我只是问 Immutable.JS、Ramda 等
如果数据结构的新版本是通过结构共享创建的,这意味着每个新版本都需要有一个指向以前版本的指针,以便它能够共享任何东西。这再次意味着旧版本的结构无法被垃圾回收,再次意味着,在您拥有状态的应用程序中,该状态将使用单调增加的内存量。如果是这种情况,那么该数据结构将在某个时候用完所有可用内存,如果它不断被修改的话。
我是不是漏掉了什么?我可以看到对于 Web 上的许多(大多数)用例(在浏览器中),这不会成为问题,因为您可能每次都只是更改结构的一小部分,并且您可能会离开页面或者在使用所有内存之前重新加载它,但是对于长时间的 运行 进程,这应该会造成问题。正确的?还好吗?
If new versions of a data structure is created by structural sharing, that means that every new version needs to have a pointer to the previous version in order for it to be able to share anything.
这在一般情况下是不正确的。新版本将有指向先前版本的 子部分 的指针。所以它共享一个分数( 通常 几乎 旧版本的数据。
例如,Ocaml 的地图 (represented and implemented by some self-balancing binary search tree variant of red-black trees) are immutable: see documentation of Map。但是如果你添加(或删除)一些绑定到(从)地图,你会得到一个 new 地图共享大多数(但不是全部)其内部节点与旧节点。
所以垃圾收集器最终会"delete"那些旧与当前"state"无关的内部节点。
BTW 网络编程(和网络导航)与 continuations and continuation-passing style. See e.g. Byrd's Web Programming with Continuations and several papers by C.Queinnec 有关。
另请阅读有关函数式编程中 monads 的更多信息。