Functional programming 在函数式语言中,状态的变化是如何工作的

Functional programming 在函数式语言中,状态的变化是如何工作的,functional-programming,Functional Programming,我想知道函数式语言如何在创建新的状态(例如向量)的情况下实现。当我有一个向量,我向这个向量添加另一个元素时,旧向量仍然保持不变,包含旧向量的新向量被创建,包含一个元素 内部如何处理?有人能解释一下吗?谢谢。如果将一个元素预先添加到链接列表中,将创建一个新的链接列表,新元素作为其头部,指向旧列表的指针作为其尾部 如果将项添加到数组中,整个数组通常会被复制,这使得以增量方式构建不可变数组的效率非常低 但是,如果只向每个数组的末尾添加一次,如下所示: arr1 = emptyArray() arr2

我想知道函数式语言如何在创建新的状态(例如向量)的情况下实现。当我有一个向量,我向这个向量添加另一个元素时,旧向量仍然保持不变,包含旧向量的新向量被创建,包含一个元素


内部如何处理?有人能解释一下吗?谢谢。

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

如果将项添加到数组中,整个数组通常会被复制,这使得以增量方式构建不可变数组的效率非常低

但是,如果只向每个数组的末尾添加一次,如下所示:

arr1 = emptyArray()
arr2 = add(arr1, 1)
arr3 = add(arr2, 2)
arr4 = add(arr3, 3)
整个过程都可以优化,这样arr1、arr2、arr3和arr4都有指向相同内存的指针,但长度不同。当然,这种优化只能在第一次添加到任何给定数组时执行。如果您有arr5=addarr4,4和arr5prime=addarr4,42,则其中至少需要一个副本


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

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

如果将项添加到数组中,整个数组通常会被复制,这使得以增量方式构建不可变数组的效率非常低

但是,如果只向每个数组的末尾添加一次,如下所示:

arr1 = emptyArray()
arr2 = add(arr1, 1)
arr3 = add(arr2, 2)
arr4 = add(arr3, 3)
整个过程都可以优化,这样arr1、arr2、arr3和arr4都有指向相同内存的指针,但长度不同。当然,这种优化只能在第一次添加到任何给定数组时执行。如果您有arr5=addarr4,4和arr5prime=addarr4,42,则其中至少需要一个副本


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

从概念上讲,每次扩展或修改向量时都会创建一个新的向量。然而,由于原始向量未经修改,因此可以使用巧妙的技术来共享结构。例如,见


另请参见冈崎的

从概念上讲,每次扩展或修改向量时都会创建一个新的向量。然而,由于原始向量未经修改,因此可以使用巧妙的技术来共享结构。例如,见


还看冈崎的

哈?我想,新对象在非FP语言中实例化的方式也是一样的。再加上由于不变性而可能进行的巧妙优化。问题是——如何用函数式语言创建对象?那是无法回答的,而且也不太有趣。嗯?我想,新对象在非FP语言中实例化的方式也是一样的。再加上由于不变性而可能进行的巧妙优化。问题是——如何用函数式语言创建对象?这个问题无法回答,而且也不太有趣。