在功能语言中,国家的变化如何发挥作用

时间:2010-10-09 18:03:43

标签: functional-programming

我想知道函数式语言如何实现“引擎盖下”创建新状态,例如Vector。当我有一个Vector并且我向该特定Vector添加另一个元素时,旧的仍然没有变化,并且创建了包含旧的Vector的新Vector,其中包含一个元素。

这是如何在内部处理的?有人可以试着解释一下吗?谢谢。

2 个答案:

答案 0 :(得分:4)

从概念上讲,每次扩展或修改Vector时都会创建一个新的Vector。但是,由于原始Vector未经修改,因此可以使用巧妙的技术来共享结构。例如,请参阅ropes

另见Okasaki的Purely Functional Data Structures.

答案 1 :(得分:0)

如果您将一个元素添加到链接列表中,则会创建一个新的链接列表,其中新元素作为其头部,指向旧列表的指针作为其尾部。

如果将一个项添加到数组中,通常会复制整个数组(这使得以递增方式构建不可变数组非常低效。)

但是如果你只添加到每个数组的末尾,就像这样:

arr1 = emptyArray()
arr2 = add(arr1, 1)
arr3 = add(arr2, 2)
arr4 = add(arr3, 3)

整个事情可以优化,所以arr1,arr2,arr3和arr4都指向同一个内存,但长度不同。当然,只有在第一次添加到任何给定数组时才能执行此优化。如果您有arr5 = add(arr4, 4)arr5prime = add(arr4, 42),则其中至少有一个需要是副本。

请注意,这不是常见的优化,因此除非文档中明确说明,否则不应指望它存在。