问题 什么是破坏性更新?


我看到许多与函数式编程相关的主题都提到了破坏性更新。我知道它与变异类似,所以我理解更新部分。但破坏性的部分是什么?或者我只是过度思考它?


11699
2017-08-06 01:40


起源

例如:破坏性更新将是就地排序列表,而非破坏性更新则是创建排序副本。破坏性的是改变数组元素,对象属性......任何作用于原始对象/数据的东西。 - li.davidm


答案:


你可能有点过分思考它。可变性就是它的全部;唯一被“摧毁”的是 以前的价值 无论你发生什么变化。

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

  • 使用不可变树,您可以沿着从新值的位置到根的路径构造新节点。不在路径中的子树在新树中重复使用,如果您仍然可以使用原始树的根,则可以使用它们,并在它们之间共享公共子树。如果您有大量略微不同的副本,这可以节省空间而不需要额外的努力,当然,您拥有不可变数据结构的所有常见好处。

  • 使用可变树,将新值附加到它所属的位置即可;没有别的东西需要改变。这几乎总是更快,如果你只有一个副本,节省内存分配,但任何引用“旧”树的东西现在都引用了新的。原件已被销毁;它永远消失了。如果你需要保留原件,你必须付出代价来创建一个全新的副本 之前 改变它。

如果“破坏”似乎是一种描述简单的就地更新的不必要的苛刻方式,那么你可能没有花费太多时间来调试代码,以便找出地球背后某些值的变化。


16
2017-08-06 02:34



说得好!不过,我认为破坏性并不严厉。这让我觉得多余。无论如何,我一直认为更新为突变。但我认为破坏性增加了这个术语急需的重点和谨慎。 :-) - Plumenator
@Plumenator:是的。 “更新”都非常具有前瞻性和乐观性,但可变性的缺点几乎总是涉及到什么事情的问题 用过的 是,而不是他们现在。因此,“破坏性更新”这个术语很适合平衡事物,并明确表示你们正在跨越桥梁并将它们烧在身后。 - C. A. McCann


命令式编程语言允许重新定义变量,例如

x = 1
x = 2

因此,x首先具有值1,然后,它具有值2.第二个操作是破坏性更新,因为x将其初始定义丢失为等于1。

这不是如何在普通数学中处理定义。一旦定义,变量就会保持其值。 上面,作为方程系统,将允许从第二个方程中减去第一个,这将给出

x - x = 2 - 1 <=> 0 = 1

这是一个虚假陈述。假设一旦引入,x是相同的。

像一个熟悉的声明

x = x + 1

会得出同样的结论。

函数语言具有相同的变量用法,一旦定义它们就无法重新分配它们。以上陈述将变为

x2 = x + 1

我们没有 for 要么 while 循环,而是递归或一些更高阶函数。


0
2018-06-06 22:08