将名称绑定到值与将值分配给变量
Binding a name to a value vs. assigning a value to a variable
阅读 Bartosz Milewski 在 fpcomplete 的文章,"In Haskell you never assign to a variable, instead you bind a name to a value."
有人可以向我解释这意味着什么,以及它在函数式编程世界中的实际影响吗?
从某种意义上说,唯一真正的区别是命令式语言中的变量可以更改,而函数式语言中的绑定名称不能。但我认为了解两者之间更高层次的语义区别以及我们如何思考它们是很重要的。
在命令式语言中,变量是一个独立的东西,恰好包含一个值。它们经常被比作装有东西的盒子。盒子的内容可以改变,并且在语义上,盒子有自己的身份。
另一方面,Haskell 名称只是值的标签。您可以完全互换地使用一个或另一个。至关重要的是,他们无法改变。
比较 Haskell 中的绑定与 Java¹ 等语言中的函数名称。这些也改变不了,你也不会自己去想;它们只是它们所附加的方法的名称。
这是一个人为的差异示例:想象一个函数 f
关闭一个命令变量 x
:
var x = 7;
function foo() {
console.log(x);
}
实际上,x
只是 7
的一个名称...直到 x
发生变化。您关闭的是 变量 x
,而不是它的值 7
,因此如果它发生变化,foo
的行为也会发生变化。
在 Haskell 中,另一方面,如果您将 7
绑定到名称 x
并关闭它,这与关闭 7
相同.
let x = 7 in \ () -> x
与
做同样的事情
\ () -> 7
(它本身除了 7
之外什么都不做,忽略了严格性问题)。
¹ 忽略反射和类似的恶作剧
阅读 Bartosz Milewski 在 fpcomplete 的文章,"In Haskell you never assign to a variable, instead you bind a name to a value."
有人可以向我解释这意味着什么,以及它在函数式编程世界中的实际影响吗?
从某种意义上说,唯一真正的区别是命令式语言中的变量可以更改,而函数式语言中的绑定名称不能。但我认为了解两者之间更高层次的语义区别以及我们如何思考它们是很重要的。
在命令式语言中,变量是一个独立的东西,恰好包含一个值。它们经常被比作装有东西的盒子。盒子的内容可以改变,并且在语义上,盒子有自己的身份。
另一方面,Haskell 名称只是值的标签。您可以完全互换地使用一个或另一个。至关重要的是,他们无法改变。
比较 Haskell 中的绑定与 Java¹ 等语言中的函数名称。这些也改变不了,你也不会自己去想;它们只是它们所附加的方法的名称。
这是一个人为的差异示例:想象一个函数 f
关闭一个命令变量 x
:
var x = 7;
function foo() {
console.log(x);
}
实际上,x
只是 7
的一个名称...直到 x
发生变化。您关闭的是 变量 x
,而不是它的值 7
,因此如果它发生变化,foo
的行为也会发生变化。
在 Haskell 中,另一方面,如果您将 7
绑定到名称 x
并关闭它,这与关闭 7
相同.
let x = 7 in \ () -> x
与
做同样的事情\ () -> 7
(它本身除了 7
之外什么都不做,忽略了严格性问题)。
¹ 忽略反射和类似的恶作剧