Reference 为什么纯函数语言只允许通过值传递参数?

Reference 为什么纯函数语言只允许通过值传递参数?,reference,functional-programming,parameter-passing,purely-functional,Reference,Functional Programming,Parameter Passing,Purely Functional,我是函数式语言的新手,我想知道为什么不能通过引用传递参数。 我发现安瑟夫斯这么说 创建对象后,不应更改对象的状态 但是我不太明白这个意思。因为如果通过引用传递参数,可能会更改参数中的某些内容,这可能会带来副作用。考虑这一点: 职能薪酬(人员、成本){ 个人钱包-=成本; } 功能货币(人){ 归还个人钱包; } let joe={姓名:“joe”,钱包:300}; console.log(money(joe));//300 薪酬(乔,20岁); console.log(money(joe));

我是函数式语言的新手,我想知道为什么不能通过引用传递参数。 我发现安瑟夫斯这么说

创建对象后,不应更改对象的状态


但是我不太明白这个意思。

因为如果通过引用传递参数,可能会更改参数中的某些内容,这可能会带来副作用。考虑这一点:

职能薪酬(人员、成本){
个人钱包-=成本;
}
功能货币(人){
归还个人钱包;
}
let joe={姓名:“joe”,钱包:300};
console.log(money(joe));//300
薪酬(乔,20岁);

console.log(money(joe));//280因为如果通过引用传递参数,可能会更改参数中的某些内容,这可能会带来副作用。考虑这一点:

职能薪酬(人员、成本){
个人钱包-=成本;
}
功能货币(人){
归还个人钱包;
}
let joe={姓名:“joe”,钱包:300};
console.log(money(joe));//300
薪酬(乔,20岁);

console.log(money(joe));//280
我想你误解了这个概念。Scheme和C/C++都是传递值语言,大多数值都是地址(引用)

纯函数式语言可以有引用,这些引用是通过值传递的。他们没有的是在同一范围内重新定义变量(变异绑定),并且他们没有可能更新引用点所指向的对象。所有操作都返回一个新对象

作为一个例子,我可以给出Java的字符串。Java不是纯粹的函数,但它的字符串是。如果将字符串更改为大写,则返回一个新的string对象,而原始对象未被更改


我知道的大多数语言都是按值传递的。路过的名字对我来说是陌生的

我想你误解了这个概念。Scheme和C/C++都是传递值语言,大多数值都是地址(引用)

纯函数式语言可以有引用,这些引用是通过值传递的。他们没有的是在同一范围内重新定义变量(变异绑定),并且他们没有可能更新引用点所指向的对象。所有操作都返回一个新对象

作为一个例子,我可以给出Java的字符串。Java不是纯粹的函数,但它的字符串是。如果将字符串更改为大写,则返回一个新的string对象,而原始对象未被更改


我知道的大多数语言都是按值传递的。路过的名字对我来说是陌生的

并不是说你不能传递引用,而是引用的透明性在引用和值之间没有程序员可见的区别,因为你不允许改变引用指向的对象。这使得在纯函数式编程中,到处传递共享引用实际上更安全、更普遍。从语义的角度来看,它们也可能是值。

与其说你不能传递引用,还不如说引用透明,引用和值之间没有程序员可见的区别,因为你不允许更改引用指向的对象。这使得在纯函数式编程中,到处传递共享引用实际上更安全、更普遍。从语义的角度来看,它们也可能是值。

这里的“按引用传递”是什么意思?没有理由不能通过纯语言中的引用引用值。这里的“通过引用传递”是什么意思?没有理由不能通过纯语言中的引用引用值。在您的示例中没有通过引用传递(javascript支持吗?)。这只是演示了一个可变字段,它是如何将
joe
传递到
pay
的一个独立问题@Lee:我想我已经解决了这个问题,请重新阅读下面两段。我使用JavaScript是为了方便StackOverflow可执行代码片段,但显然JavaScript不是纯功能性的,我不能用Haskell这样的纯功能性语言制作一个示例,因为不可能真正构建对比(非纯)示例(好吧,如果没有使用
UnsafePerformIO
之类的工具作弊的话)在您的示例中没有引用传递(javascript支持吗?)。这只是演示了一个可变字段,它是如何将
joe
传递到
pay
的一个独立问题@Lee:我相信我已经解决了这个问题,请重新阅读下面的两段。我使用JavaScript是为了方便StackOverflow可执行代码段,但显然JavaScript不是纯功能性的,我无法进行examp使用Haskell之类的纯函数式语言编写示例,因为构建对比(非纯)示例是不可能的(好吧,如果不使用
UnsafePerformIO
或其他东西进行欺骗的话)。