在“编程Erlang”一书中,有人说该语言使用“单赋值”变量。在其他关于函数式编程语言的文章中,我总是读到“不可变值”。
“单一赋值”一词是否与“不可变值”有所不同?
发布于 2012-03-18 03:56:55
在erlang中,变量可以是绑定的,也可以是未绑定的。只能为未绑定的变量赋值。这就是单一赋值的原因,因为一旦绑定了变量,就不能再给它赋值了。因此,在erlang中,即使0和1是不可变值,也不能执行以下操作。
X = 1.
X = 2. // This is not a valid operation术语不可变是相对于变量的值,而不是变量本身。因此,在某些语言中,您可以为同一变量分配不可变的不同值:
X = immutableValue;
X = anotherImutableValue; // This is a valid operation编辑:来自维基百科的
Immutable Object
在面向对象和函数式编程中,不可变对象是指其状态在创建后不可修改的对象。
Single Assignment
单次赋值是名称绑定的一个示例,它与本文中描述的赋值的不同之处在于,只能执行一次,通常是在创建变量时;不允许后续的重新赋值。..。一旦通过单一赋值创建,命名值就不是变量,而是不可变对象。
发布于 2012-03-18 03:56:25
差异与(重新)绑定变量和变化值之间的差异有关。
“单赋值”是指不能重新绑定不同值的变量,例如:
1> A = 1.
2> A = 2.
** exception error: no match of right hand side value 2另一方面,“不可变值”意味着您不能更改值本身(例如,从并行线程),因此,如果您想要修改列表,则必须创建一个副本或语义上等效的东西,而不是就地更改。
发布于 2012-03-18 03:48:31
Haskell程序员报告。是的,“单一赋值”和“不可变值”是完全相同的东西。Haskell对这个概念进行了更深层次的研究:所有东西的值都是在编译时定义的。是的,所有的一切。
您可能会问,既然Haskell可以清楚地执行I/O,那么这是如何可能的。答案是,当您定义从外部世界提取输入的操作时,您并不是在定义值,而只是定义了提取它的操作。您永远不会显式定义绑定的值。在Haskell中,当您执行以下操作时:
echo = forever $ do
x <- getLine
putStrLn x您并不是在“定义”x,而只是告诉getLine和putStrLn如何交互。您实际定义的惟一内容是echo,它只不过是一个等待运行的操作。显然,echo的行为是在编译时定义的,而x的值则不是。
也许你已经知道了,但我写这篇文章也是为了帮助那些对Haskell与Erlang有类似问题的人。
https://stackoverflow.com/questions/9753080
复制相似问题