ysi*_*son 4 functional-programming immutability julia
在朱莉娅,为什么不变性是整体类型的"属性"(在朱莉亚意义上,更像是其他语言中的结构或类)而不是变量?
例如在Rust中(我认为大多数支持不变性的语言),是否某些东西是不可变的是设置在特定变量而不是整体类型上 - 即没有单独的Vector
vs ImmutableVector
结构.为了创建一个不可变的向量,我做let v = Vec::new()
.为了创造一个可变的,我做let mut v = Vec::new()
.mut
因此是一个可以应用于任何结构的关键字.
这似乎更方便,因为你可以创建任何不可变的变量,默认情况下变量是不可变的(Julia人希望人们尽可能多地做[1]).相反,采用Julia方法是否有实用或性能提升?
1:https://github.com/JuliaLang/julia/issues/13#issuecomment-11007166
是否某些东西是不可变的是在特定变量而不是整体类型上设置的
我认为这里有一些关于我们对类型和价值的含义的混淆.
在您的示例中,您提供了一个可变且不可变的向量:
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'关键字的技巧是使用此信息注释类型的方法,就像参数类型在其他语言中的行为一样.