Programming languages 不变性:变量、值或API的属性?

Programming languages 不变性:变量、值或API的属性?,programming-languages,immutability,language-design,Programming Languages,Immutability,Language Design,我正在设计一种逐渐类型化的语言作为个人项目,我被一个关于不变性的特殊设计决策所困扰 用一种与语言无关且可能很粗糙的方式来讨论这个问题,我说有两种东西可以是不变的或不变的:变量绑定和值本身 常量的变量绑定类似于Javascript中的const或Java中的final,其中变量不能重新分配。值本身是不可变的,就像C++中的const或Object.freeze在JavaScript中一样。 我的问题是,在不可变值而不是绑定的情况下,不可变性应该是什么属性 Javascript的object.fre

我正在设计一种逐渐类型化的语言作为个人项目,我被一个关于不变性的特殊设计决策所困扰

用一种与语言无关且可能很粗糙的方式来讨论这个问题,我说有两种东西可以是不变的或不变的:变量绑定和值本身

常量的变量绑定类似于Javascript中的const或Java中的final,其中变量不能重新分配。值本身是不可变的,就像C++中的const或Object.freeze在JavaScript中一样。 我的问题是,在不可变值而不是绑定的情况下,不可变性应该是什么属性

Javascript的object.freeze中的值/对象本身

或C++中的一部分类型?

const Point p(10);
还是像铁锈一样的变量绑定

let p = Point { x: 10 };
// vs let mut p = Point { x: 10 };
还是作为库API的一部分?Facebook的Immutable.js、Google的用于Java ImmutableList类的Guava库等


我知道这可能没有正确的答案,所以我真正想要的是比较这些方法的哲学和动机。

有一个正确的答案,但它与您所期望的大不相同


最好的方法是根本不具有可变性。换句话说:语言应该是纯功能性的。在使用垃圾收集的语言中没有理由具有可变性。哈斯克尔就是证明。

我理解这一观点,但我不同意这是正确的答案。当然,这是一种主观观点,认为纯粹的不变性是做事情的最佳方式。我想象中的目标受众可能更喜欢一种控制可变性的方法,因此我正在寻找一种优雅而正确地提供这种控制的方法。现代纯函数语言提供了突变的可能性,也提供了非常优雅且无bug的控制方法。它只是在比核心语言语义更高的层次上完成的。因此说哈斯克尔是最好的命令式语言。我理解听众的推理,但我不同意。应该鼓励他们转向纯粹的函数式编程,而不是给命令式的观众提供另一种语言。啊,好吧,我们似乎已经陷入了僵局。
let p = Point { x: 10 };
// vs let mut p = Point { x: 10 };