Functional programming 函数式编程中数据结构和变量的不变性

Functional programming 函数式编程中数据结构和变量的不变性,functional-programming,immutability,Functional Programming,Immutability,人们通常说,在函数式编程中,数据结构是不可变的。我知道不可变数据结构是一种无法更改的数据结构 然而,这是否也意味着变量引用也不能更改 比如说, var arr=[1,2,3] arr=[4,5,6] 在这段代码中,我没有更改数组[1,2,3],而是创建了一个新的数组。尽管如此,我还是更改了变量“arr”的引用。此代码是否遵循数据结构不可变的原则 您不应该重新分配引用。理想情况下,您应该创建一个新变量,这样您就可以看到所做任何更改的“之前和之后” 然而,即使指向它的引用发生了变化,底层结构仍然是不

人们通常说,在函数式编程中,数据结构是不可变的。我知道不可变数据结构是一种无法更改的数据结构

然而,这是否也意味着变量引用也不能更改

比如说,

var arr=[1,2,3]

arr=[4,5,6]


在这段代码中,我没有更改数组[1,2,3],而是创建了一个新的数组。尽管如此,我还是更改了变量“arr”的引用。此代码是否遵循数据结构不可变的原则

您不应该重新分配引用。理想情况下,您应该创建一个新变量,这样您就可以看到所做任何更改的“之前和之后”


然而,即使指向它的引用发生了变化,底层结构仍然是不可变的。如果有人正在查看结构的旧版本,重新分配引用不会损害数据的有效性,因为旧版本仍然存在,没有改变

您不应该重新分配引用。理想情况下,您应该创建一个新变量,这样您就可以看到所做任何更改的“之前和之后”

然而,即使指向它的引用发生了变化,底层结构仍然是不可变的。如果有人正在查看结构的旧版本,重新分配引用不会损害数据的有效性,因为旧版本仍然存在,没有改变

这是否也意味着变量引用也不能更改

对。它们被称为常数。你最好写信

const arr1 = [1,2,3] 
const arr2 = [4,5,6]
这种方法还允许您将作用域环境视为不可变的数据结构,这应该是默认的。它使关于代码的推理变得容易得多

这是否也意味着变量引用也不能更改

对。它们被称为常数。你最好写信

const arr1 = [1,2,3] 
const arr2 = [4,5,6]

这种方法还允许您将作用域环境视为不可变的数据结构,这应该是默认的。它使关于代码的推理变得更加容易。

如果数据结构是可变的,那么一旦一个线程修改它,另一个线程读取它,就必须采取措施防止争用情况。不变的数据结构节省了处理竞争条件的工作量。但是,不可变引用的好处是什么?为什么函数式编程更改引用不好?@CrazySynthax,因为它使思考代码和在无任何变化时遵循“数据流”变得更加容易。假设你有一个大函数,其中某个变量在整个函数中使用。如果该变量在函数中途被有条件地重新赋值,那么现在您必须考虑该值以前是什么,它变成什么,而不是仅仅知道该值保持不变。@函数式编程中的CrazySynthax与命令式编程不同,不必重新赋值,既然除了不多创建一个变量之外没有其他好处,那就不应该这样做。是的,我就是这么说的。这在命令式编程中是必要的,因为范例严重依赖于需要重新分配引用的循环结构。在循环的标准命令
,由于循环本身的计算结果不是某个值,因此需要重新分配现有的引用,以查看循环的效果(或以其他方式执行副作用)。在函数式编程中,您应该使用缩减或映射,它创建新变量而不是修改现有变量。@CrazySynthax我应该澄清一下,赋值是否是线程安全的取决于语言等因素。当使用不可变数据结构时,任何给定的线程都将查看值的不可变副本,而不是引用。当您将
arr
重新分配给第二个数组时,这不会产生任何影响,因为查看原始数组的任何人都将持有原始数组的副本;如果一个数据结构是可变的,那么一旦一个线程修改了它,另一个线程读取了它,就必须做一些工作来防止争用情况。不变的数据结构节省了处理竞争条件的工作量。但是,不可变引用的好处是什么?为什么函数式编程更改引用不好?@CrazySynthax,因为它使思考代码和在无任何变化时遵循“数据流”变得更加容易。假设你有一个大函数,其中某个变量在整个函数中使用。如果该变量在函数中途被有条件地重新赋值,那么现在您必须考虑该值以前是什么,它变成什么,而不是仅仅知道该值保持不变。@函数式编程中的CrazySynthax与命令式编程不同,不必重新赋值,既然除了不多创建一个变量之外没有其他好处,那就不应该这样做。是的,我就是这么说的。这在命令式编程中是必要的,因为范例严重依赖于需要重新分配引用的循环结构。在循环的标准命令
,由于循环本身的计算结果不是某个值,因此需要重新分配现有的引用,以查看循环的效果(或以其他方式执行副作用)。在函数式编程中,您应该使用缩减或映射,它创建新变量而不是修改现有变量。@CrazySynthax我应该澄清一下,赋值是否是线程安全的取决于语言等因素。当使用不可变数据结构时,任何给定的线程都将查看值的不可变副本,而不是引用。当您将
arr
重新分配给第二个数组时,这不会产生任何影响,因为查看原始数组的任何人都将持有ori的副本