通过Bartosz Milewski撰写的文章fpcomplete阅读,"In Haskell you never assign to a variable, instead you bind a name to a value."
有人可以向我解释这意味着什么,以及函数式编程世界中这种实际的后果吗?
答案 0 :(得分:13)
从某种意义上说,唯一真正的区别是命令式语言中的变量可以改变,而函数式语言中的绑定名称则不能。但我认为理解两者之间更高级别的语义区别以及我们如何以不同方式思考这一点非常重要。
在命令式语言中,变量本身就是一个包含值的东西。它们经常被比作包含某些东西的盒子。框的内容可以更改,并且在语义上,框具有自己的标识。
另一方面,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
之外,它本身不会做任何事情,忽略严格性问题。)
¹无视反射和类似的恶作剧