将名称绑定到值与将值分配给变量

Bre*_*dan 6 haskell functional-programming

通过Bartosz Milewski撰写的文章阅读fpcomplete,"In Haskell you never assign to a variable, instead you bind a name to a value."

有人可以向我解释这意味着什么,以及功能编程领域的实际影响吗?

Tik*_*vis 13

从某种意义上说,唯一真正的区别是命令式语言中的变量可以改变,而函数式语言中的绑定名称则不能.但我认为理解两者之间更高级别的语义区别以及我们如何以不同方式思考它们非常重要.

在命令式语言中,变量本身就是一个包含值的东西.它们经常被比作包含某些东西的盒子.框的内容可以改变,并且在语义上,框具有其自己的标识.

另一方面,Haskell名称只是值的标签.您可以完全互换使用其中一个.至关重要的是,他们无法改变.

将Haskell中的绑定与Java¹等语言中的函数名进行比较.这些也不会改变,你自己也不会想到它们; 他们只是他们附加的方法的名称.

这是一个设计差异的例子:想象一个f关闭命令变量的函数x:

var x = 7;
function foo() {
  console.log(x);
}
Run Code Online (Sandbox Code Playgroud)

实际上,x只是...的名称,7直到x更改.你关闭的是变量 x,而不是它的值7,所以如果它改变了,那么它的行为就是foo.

另一方面,在Haskell中,如果绑定7到名称x并将其关闭,那就像关闭一样7.

let x = 7 in \ () -> x
Run Code Online (Sandbox Code Playgroud)

做同样的事情

\ () -> 7
Run Code Online (Sandbox Code Playgroud)

(这本身不仅仅是7单独做,而忽略了严格性问题).

¹无视反射和类似的恶作剧

  • 我通常认为差异为"为变量赋值"(变量名为'x',您的值现在应为7)与"为某个值赋值"(7,此后您也称为'x' "). (3认同)
  • @newacct:这更重要的是“功能性”是一个定义不明确的术语。使用 `set!` 的方案本质上并不比 JavaScript 更实用,只是它具有一些*鼓励*以函数式风格进行编程的功能。 (2认同)