我想知道函数式语言如何实现“引擎盖下”创建新状态,例如Vector。当我有一个Vector并且我向该特定Vector添加另一个元素时,旧的仍然没有变化,并且创建了包含旧的Vector的新Vector,其中包含一个元素。
这是如何在内部处理的?有人可以试着解释一下吗?谢谢。
答案 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)
,则其中至少有一个需要是副本。
请注意,这不是常见的优化,因此除非文档中明确说明,否则不应指望它存在。