更新榆树的记录(旧的记录怎么了?)

时间:2017-10-11 09:29:28

标签: elm records

首先请关闭以下帖子:

Updating a record in Elm

我对这实际上是如何可能更加好奇,因为这会使记录成为变量,函数式编程会试图避免这种变量?

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

1 个答案:

答案 0 :(得分:7)

功能编程避免了变异。在Elm中,记录没有变异,它们被复制。

即使说他们被复制也有点歪曲。它们不是完全克隆字节的字节。这将是非常低效的。它们的内部结构更像图形,允许有效的基于指针的操作,有效地扩展底层结构,而无需在执行复制到新记录的操作时改变已存在的节点和边缘。

从概念上讲,以这种方式思考它可能会有所帮助:一旦你复制到一个新的记录值,旧的记录就永远存在。但是,我们的计算机没有无限的内存,那些旧的值可能经常永久未使用,因此我们将它留给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 }

内部表示可以这样想:

all the bills

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

bye bye gates