gpt4 book ai didi

haskell - 为什么使用外部作用域中定义的函数不会破坏引用透明性?

转载 作者:行者123 更新时间:2023-12-01 07:04:55 25 4
gpt4 key购买 nike

我正在学习 Haskell。如果我理解正确的话,Haskell 中的一个简单函数总是引用透明的。我认为这意味着它的输出仅取决于传递给它的参数。

但是一个函数f可以调用另一个函数 g , 定义在外部作用域中。所以从这个意义上说,f的返回值取决于 g 的定义.和函数 g没有传递给 f作为参数 - 至少不是明确的。这不会破坏引用透明度吗?

最佳答案

关键是不变性。

我将通过与默认允许可变性的语言 - Javascript 进行比较来说明这一点。考虑以下代码:

f = function(x) {
return x;
}

g = function(y) {
f = function(x) {
return x+y;
}
}

现在你可以打破引用透明度:
f(1)   -- returns 1
g(10)
f(1) -- returns 11

我们没有引用透明度,因为您无法替换对 f 的调用与他们的值(value)。例如,在代码中
console.log(f(1))
g(10)
console.log(f(1))

你可能想象你可以替换对 f(1) 的两个调用。用它们的值( 1 ),得到
console.log(1)
g(10)
console.log(1)

即输出 1 的一段代码到控制台两次。但实际上,运行原始代码输出 1然后输出 11 ,因为中间有电话打到 g(10) .

这在 Haskell 中是不可能的,因为所有值都是不可变的。换句话说,在 Haskell 中你不能写函数 g它修改了其作用域之外的另一个函数的值。在 Haskell 中,你总是可以用它们的值替换函数调用,而不会破坏你的代码。

关于haskell - 为什么使用外部作用域中定义的函数不会破坏引用透明性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12722554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com