在 Julia 中,为什么不可变性是整体类型的“属性”(在 Julia sense of the word 中,更类似于其他语言中的结构或类)而不是变量?
例如在 Rust(我认为大多数支持不变性的语言)中,某些东西是否不可变是在特定变量而不是整体类型上设置的 - 即没有单独的 Vector
对比 ImmutableVector
结构。为了创建一个不可变的向量,我做 let v = Vec::new()
.为了创建一个可变的,我做 let mut v = Vec::new()
. mut
因此是一个可以应用于任何结构的关键字。
这看起来更方便,因为你可以使任何东西不可变,并且默认情况下变量是不可变的(Julia 的人希望人们尽可能多地这样做 [1])。使用 Julia 方法是否会带来务实或性能提升?
1:https://github.com/JuliaLang/julia/issues/13#issuecomment-11007166
最佳答案
whether something is immutable is set on specific variables rather than overall types
我认为这里有一些关于我们赋予类型和值的含义的混淆。
在你的例子中,你给出了一个可变和不可变的向量:
let v = Vec::new().
let mut v = Vec::new()
所以这些似乎具有相同的类型,“Vec”,但不知何故,第二个是不可变的。你已经通过一个新的关键字“mut”用一个额外的不变性属性来标记它。
您也可以将此属性想象为该类型的一部分,例如:
let v = Vec<Pure>::new().
let v = Vec<Mutable>::new().
使用类型参数传入可变/不可变标签。一个好处是不需要额外的关键字,但它需要一个支持高阶类型的类型系统。
“mut”关键字实际上只是告诉编译器有关特定属性的另一种方式——它添加了“类型”信息。如果类型系统具有足够的表达能力,该信息也可以直接在类型语法中传递。无论哪种方式,编译器都知道该属性并可以对其进行优化。
因此,总而言之,即使可变性/效果不是具体类型语法的一部分,它们在逻辑上仍然是编译器所看到的“类型”的一部分。像“mut”关键字这样的技巧是用这些信息注释类型的方法,与其他语言中类型的参数的行为方式相同。
关于functional-programming - 为什么在 Julia 中对类型(而不是变量)设置了不变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26966395/