为什么Julia的类型(而不是变量)设置了不变性?

ysi*_*son 4 functional-programming immutability julia

在朱莉娅,为什么不变性是整体类型的"属性"(在朱莉亚意义上,更像是其他语言中的结构或类)而不是变量?

例如在Rust中(我认为大多数支持不变性的语言),是否某些东西是不可变的是设置在特定变量而不是整体类型上 - 即没有单独的Vectorvs ImmutableVector结构.为了创建一个不可变的向量,我做let v = Vec::new().为了创造一个可变的,我做let mut v = Vec::new().mut因此是一个可以应用于任何结构的关键字.

这似乎更方便,因为你可以创建任何不可变的变量,默认情况下变量是不可变的(Julia人希望人们尽可能多地做[1]).相反,采用Julia方法是否有实用或性能提升?

1:https://github.com/JuliaLang/julia/issues/13#issuecomment-11007166

Don*_*art 5

是否某些东西是不可变的是在特定变量而不是整体类型上设置的

我认为这里有一些关于我们对类型和价值的含义的混淆.

在您的示例中,您提供了一个可变且不可变的向量:

let v = Vec::new().
let mut v = Vec::new()
Run Code Online (Sandbox Code Playgroud)

所以这些似乎具有相同的类型,"Vec",但不知何故,第二个是不可变的.您已通过新关键字"mut"为其添加了一个额外的不可变性属性.

您可以将此属性想象为类型的一部分,例如:

let v = Vec<Pure>::new().
let v = Vec<Mutable>::new().
Run Code Online (Sandbox Code Playgroud)

使用type参数传入mutable/immutable标记.一个好处是不需要额外的关键字,但它需要一个支持更高阶类型的类型系统.

"mut"关键字实际上只是告诉编译器特定属性的另一种方式 - 它添加了"类型"信息.如果类型系统足够表达,那么该信息也可以直接以类型语法传递.无论哪种方式,编译器都知道该属性并可以对其进行优化.

因此,总而言之,即使可变性/效果不是具体类型语法的一部分,它们仍然是逻辑上编译器看到的"类型"的一部分.类似'mut'关键字的技巧是使用此信息注释类型的方法,就像参数类型在其他语言中的行为一样.

  • 我认为这个答案的重点是可变性与不变性(与绑定的常量性相对)是类型的特征,而不是变量。Rust 在这里所做的是为您声明的每个类型隐式创建 *两种 * 类型——可变版本和不可变版本。 (2认同)