在 Elm 中更新记录(旧的发生了什么?)

Updating Records in Elm ( what happened to the old one?)

好的,首先请看下面的post:

Updating a record in Elm

我更好奇这实际上是如何实现的,因为这实际上使记录成为一个变量,函数式编程试图避免这种情况?

我的旧账单怎么了?有人基本上删除了我的 x = 4 并制作了一个新的 x = boo_far?

函数式编程避免了突变。在 Elm 中,记录不会发生变化,它们会被复制。

即使说它们是 复制的 也有点失实。它们没有完全 克隆 一个字节一个字节。那将是非常低效的。它们的内部结构更像图,允许有效的基于指针的操作,当您执行 copy 到新记录的操作时,可以有效地扩展底层结构而不改变已经存在的节点和边.

从概念上讲,这样想可能会有所帮助:一旦您复制到一个新的记录值中,旧的记录值就会永远存在。然而,我们的计算机并没有无限的内存,那些 old 的值可能经常永久不用,所以我们把它留给 Javascript 的垃圾收集器来清理那些旧的指针。

考虑 example in the answer given by @timothyclifford:

-- Create Bill Gates
billGates = { age = 100, name = "gates" }

-- Copy to Bill Nye
billNye = { bill | name = "Nye" }

-- Copy to a younger Bill Nye
youngBillNye = { billNye | age = 22 }

内部表示可以这样想:

从概念上来说,你可以想到那些长生不老的人。但是,假设 billGates 被选中进行垃圾删除,因为它不再被引用(例如,它的帧从堆栈中弹出)。 billGates指针被删除,name=="gates"节点被删除,但所有其他节点和边保持不变: