我看到很多与函数式编程相关的主题都提到了破坏性更新。我知道它与变异类似,所以我理解更新部分。但破坏性的部分是什么?或者我只是过度思考它?
答案 0 :(得分:17)
你可能会过度思考它。可变性就是它的全部;唯一被“摧毁”的是以前的值你所变异的东西。
假设您正在使用某种搜索树来存储值,并且您想要插入一个新值。找到新值所在的位置后,您有两个选择:
使用不可变树,您可以沿着从新值的位置到根的路径构造新节点。不在路径中的子树在新树中重复使用,如果您仍然可以使用原始树的根,则可以使用它们,并在它们之间共享公共子树。如果您周围有许多略有不同的副本,这可以节省空间而不需要额外的努力,当然,您拥有不可变数据结构的所有常见好处。
使用可变树,将新值附加到它所属的位置即可;没有别的东西需要改变。这几乎总是更快,如果你只有一个副本,节省内存分配,但任何引用“旧”树的东西现在都引用了新的。原件已被销毁;它永远消失了。如果你需要保留原文,你必须花费在更改之前创建整个的全新副本。
如果“破坏”似乎是一种描述简单的就地更新的不必要的苛刻方式,那么你可能没有花费太多时间来调试代码,以便找出地球上某些值正在被改变的背后你的背。
答案 1 :(得分:0)
命令式编程语言允许重新定义变量,例如
x = 1
x = 2
因此x首先具有值1,然后,它具有值2.第二个操作是破坏性更新,因为x将其初始定义丢失为等于1.
这不是普通数学中定义的处理方式。定义后,变量保持其值。 以上,作为方程组,将允许从第二个方程中减去第一个,这将给出
x - x = 2 - 1 <=> 0 = 1
这是一个错误的陈述。假设一旦引入,x就是相同的。
熟悉的陈述,如
x = x + 1
会得出同样的结论。
函数语言具有相同的变量用法,一旦定义它们就无法重新分配它们。以上陈述将变为
x2 = x + 1
我们没有for
或while
循环,而是递归或更高阶函数。