好的首先请看下面的帖子:
我更好奇的是,这实际上是如何可能的,因为这使得记录变为有效的变量,函数式编程试图避免?
我的旧账单怎么了?有人基本上删除了我的x = 4并创建了一个新的x = boo_far?
功能编程避免了突变.在Elm中,记录没有变异,它们被复制.
即使说他们被复制也有点歪曲.它们不是完全克隆的字节.这将是非常低效的.它们的内部结构更像图形,允许有效的基于指针的操作,有效地扩展底层结构,而无需在执行复制到新记录的操作时改变已存在的节点和边缘.
从概念上讲,以这种方式思考它可能会有所帮助:一旦你复制到一个新的记录值,旧的记录值永远存在.但是,我们的计算机没有无限的内存,而这些旧的值可能经常永久未使用,因此我们将它留给Javascript的垃圾收集器来清理那些旧的指针.
考虑一下@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 }
Run Code Online (Sandbox Code Playgroud)
内部表示可以被认为是这样的:

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