【问题标题】:Does immutability mean that huge collections get completely recreated every time they change?不变性是否意味着每次更改时都会完全重新创建庞大的集合?
【发布时间】:2018-10-17 16:15:21
【问题描述】:

我最近一直在尝试进入函数式编程。具体来说,我对 Clojure 很感兴趣。我理解大多数关于数据不变性的论点,但有一件事对我来说没有意义。假设我有一个非常大的集合,例如包含数亿个项目的地图或数组。如果我不能改变它,那么这是否意味着每次我想添加一个新项目时,我实际上是在重新创建整个集合?这听起来像是一个可怕的想法。在一切都是不可变的语言中,如何处理这种情况?

【问题讨论】:

标签: clojure functional-programming immutability


【解决方案1】:

对于 Clojure,它们不会每次都重新创建。 Rich Hickey 确保使用persistent data structures,正如他在“专家到专家”interview 中解释的那样。

你可以把它想象成一个链表。

class LinkedList<E> {
    E data;
    LinkedList<E> next;

    LinkedList<E> cons(E item) {
        return new LinkedList(item, this);
    }
}

每次你cons一个值到前面,你不需要创建一个新的链表,而只是保留对前一个的引用。

同样,即使是像地图这样的数据结构,当它们的差异很小时,也可以共享它们的大量数据。这有助于减少使用的大小。

此外,Clojure 还提供 transient data structures,这是其不可变集合的可变版本,允许您对数据结构进行多项更改,而无需复制/共享数据。

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多