functional-programming - 什么是破坏性更新?

标签 functional-programming immutability

我看到很多与函数式编程相关的主题都提到了破坏性更新。我知道它类似于突变,所以我理解更新部分。但破坏性的部分是什么?还是我只是想多了?

最佳答案

你可能有点想多了。可变性就是它的全部。唯一被“破坏”的是你变异的任何东西的先前值。

假设您正在使用某种搜索树来存储值,并且您想插入一个新的。找到新值所在的位置后,您有两个选择:

  • 使用不可变树,您可以沿着从新值位置到根的路径构建新节点。不在路径上的子树在新树中被重用,如果您仍然有对原始树根的引用,您可以同时使用它们,并在它们之间共享公共(public)子树。如果您有大量略有不同的副本漂浮在各处,这可以节省空间而无需额外的努力,当然您还拥有不可变数据结构的所有常见好处。
  • 使用可变树,您可以将新值附加到它所属的位置,仅此而已;无需更改任何其他内容。这几乎总是更快,并且如果您只有一个副本,则可以节省内存分配,但是任何引用“旧”树的东西现在都引用了新树。原件已销毁;它永远消失了。如果您需要保留原件,则必须在更改之前花费创建整个东西的全新副本的费用。

  • 如果“破坏”似乎是一种不必要的苛刻方式来描述简单的就地更新,那么您可能没有像我调试代码那样花费那么多时间来弄清楚地球上的某个值在您背后改变的地方。

    关于functional-programming - 什么是破坏性更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6964233/

    相关文章:

    java - lambda 表达式如何映射到函数式接口(interface)?

    performance - 方案:数据序列化,高效[和功能]

    java - 如何防止不可变对象(immutable对象)中的可变对象发生更改

    rust - 为什么我不能可变地移动捕获不可变变量?

    javascript - 从对象中删除值而不发生突变

    java - 在 Java 中将字符串设置为私有(private)或公共(public)

    .net - 中序遍历树并将给定函数应用于所有节点

    haskell - 哪些编程语言有类似 Haskell 的 `newtype`

    data-structures - 功能数据结构中的简单 "undo"

    java - 将字符串类型引用标记为 volatile 安全吗?