在函数式编程中,使用什么术语来区分避免修改变量所指的内容,以及避免修改对象本身?
对于example,在Ruby中,
name += title
避免修改先前由name
引用的对象,而是创建一个新对象,但令人遗憾的是name
引用了新对象,而
full_title = name + title
不仅可以避免修改对象,还可以避免修改name
引用的内容。
您将使用什么术语来避免使用前者的代码?
答案 0 :(得分:1)
使用名称来引用封闭/上一个范围内的名称以外的名称称为“遮蔽”该名称。它确实不同于突变。例如,在Haskell中,我可以写
return 1 >>= \x -> return (x + 1) >>= \x -> print x.
打印的x
是第二个lambda引入的2
,即foo = do
x <- return 1
x <- return (x + 1)
print x
。
在表示法中,这看起来更为熟悉:
{{1}}
据我了解,Erlang完全禁止别名。
然而,我怀疑mathepic在Ruby方面是正确的 - 它不仅遮蔽了名称,而且改变了一些基础对象。另一方面,我不太了解Ruby ......
答案 1 :(得分:1)
我认为函数式编程语言根本没有任何运算符破坏性地更新其中一个源操作数(破坏性更新,也许是你正在寻找的术语?)。在指令集设计中也可以看到类似的哲学:RISC哲学(在even the x86 architecture中越来越多地用于新的扩展)是为二元运算符提供三操作数指令,你必须明确指定目标操作数是如果您想要破坏性更新,则与其中一个来源相同。
对于后者,一些混合语言(如Scala;在X10中使用相同的术语)区分值(val
)和变量(var
)。前者不能重新分配,后者可以。如果他们指向一个可变对象,那么当然该对象本身仍然可以被修改。