functional-programming - 为什么在 Julia 中对类型(而不是变量)设置了不变性?

标签 functional-programming immutability julia

在 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/

相关文章:

在不使用匿名函数的情况下创建函数适配器

wpf - F# WPF - 在 Viewport3D 中显示简单对象

javascript - 如何使用 Immutable.js 从 javascript 原始对象创建记录映射?

string - 如何使用 Julia 替换字符串中的多个字符

Julia 使用 argmax 返回矩阵行内的索引而不是 CartesianIndex

arrays - 更改 Julia 数组中每个元素的类型

javascript - 如何在 JavaScript 中有效地组合多个 Maybe monad?

php - 传递带有多个 PHP 变量的 SQL WHERE 子句

java - 为什么继续对不可变对象(immutable对象)使用 getter?

ios - 是否可以仅使用常量属性在两个结构之间实现双向关系?