首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang“单一赋值”与Haskell“不可变值”是否不同?

Erlang“单一赋值”与Haskell“不可变值”是否不同?
EN

Stack Overflow用户
提问于 2012-03-18 03:36:13
回答 5查看 3.3K关注 0票数 15

在“编程Erlang”一书中,有人说该语言使用“单赋值”变量。在其他关于函数式编程语言的文章中,我总是读到“不可变值”。

“单一赋值”一词是否与“不可变值”有所不同?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-18 03:56:55

在erlang中,变量可以是绑定的,也可以是未绑定的。只能为未绑定的变量赋值。这就是单一赋值的原因,因为一旦绑定了变量,就不能再给它赋值了。因此,在erlang中,即使01是不可变值,也不能执行以下操作。

代码语言:javascript
复制
X = 1.
X = 2. // This is not a valid operation

术语不可变是相对于变量的值,而不是变量本身。因此,在某些语言中,您可以为同一变量分配不可变的不同值:

代码语言:javascript
复制
X = immutableValue;
X = anotherImutableValue; // This is a valid operation

编辑:来自维基百科的

Immutable Object

在面向对象和函数式编程中,不可变对象是指其状态在创建后不可修改的对象。

Single Assignment

单次赋值是名称绑定的一个示例,它与本文中描述的赋值的不同之处在于,只能执行一次,通常是在创建变量时;不允许后续的重新赋值。..。一旦通过单一赋值创建,命名值就不是变量,而是不可变对象。

票数 17
EN

Stack Overflow用户

发布于 2012-03-18 03:56:25

差异与(重新)绑定变量和变化值之间的差异有关。

“单赋值”是指不能重新绑定不同值的变量,例如:

代码语言:javascript
复制
1> A = 1.
2> A = 2.
** exception error: no match of right hand side value 2

另一方面,“不可变值”意味着您不能更改值本身(例如,从并行线程),因此,如果您想要修改列表,则必须创建一个副本或语义上等效的东西,而不是就地更改。

票数 7
EN

Stack Overflow用户

发布于 2012-03-18 03:48:31

Haskell程序员报告。是的,“单一赋值”和“不可变值”是完全相同的东西。Haskell对这个概念进行了更深层次的研究:所有东西的值都是在编译时定义的。是的,所有的一切。

您可能会问,既然Haskell可以清楚地执行I/O,那么这是如何可能的。答案是,当您定义从外部世界提取输入的操作时,您并不是在定义值,而只是定义了提取它的操作。您永远不会显式定义绑定的值。在Haskell中,当您执行以下操作时:

代码语言:javascript
复制
echo = forever $ do
    x <- getLine
    putStrLn x

您并不是在“定义”x,而只是告诉getLine和putStrLn如何交互。您实际定义的惟一内容是echo,它只不过是一个等待运行的操作。显然,echo的行为是在编译时定义的,而x的值则不是。

也许你已经知道了,但我写这篇文章也是为了帮助那些对Haskell与Erlang有类似问题的人。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9753080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档