为什么 A = Tuple{4, 5} 是有效的 Julia 语法?这是什么意思?

phu*_*usz 4 types julia

我正在浏览 Julia 文档,当我在 Julia REPL 中尝试一些东西时,我不小心输入A = Tuple{4,5}A = (4,5). 令我惊讶的是,这并没有引发错误。

为什么这A是 aDataType即使 4 和 5 是Int64/ 的实例Int32

Ste*_*ski 5

因为Tuple{Int, String}is 的类型(123, "hello")类似地Tuple{4, 5}将是一个双元素元组的类型4,其第一个值具有 type ,其第二个值具有 type 5。当然,4and5不是任何值的类型,所以这实际上不是任何可以存在的值的类型,但它仍然是一种类型,只是一个“无人居住”的类型,即没有任何实例的类型。一般来说,Julia 的类型系统完全适用于无人居住的类型。

我们可以Tuple{4, 5}通过坚持参数Tuple必须是类型来阻止对象被构造,但是这还没有完成,因为让人们构造这个类型对象并没有真正的危害。即使 Julia 确实Tuple{4, 5}通过坚持将 to 的参数设为Tuple类型来阻止您进行构造,这仍然是有效的语法,因为通常情况下, to 的参数Tuple是任意表达式,4并且5是完全有效的表达式,恰好评估为不' t 作为 的参数很有意义Tuple。同样,如果我写了Tuple{A, B}这将是有效的语法,即使我们有A = 4B = 5。所以虽然我们可以防止Tuple{4, 5} 从构造开始,这将始终是有效的语法。

还应该注意的是,即使参数 toTuple没有意义,除非它们是类型,但将类型参数作为值而不是类型通常很有用。例如,类型[1 2; 3 4]Array{Int, 2}其中第二个类型参数是整数,表示数组是二维的,而第一个参数给出数组的元素类型。

  • 退一步来说,花括号是描述_类型参数_的方式,而定义哪些类型的参数是“合理的”完全取决于类型本身(有[一个限制](https://docs.julialang.org/ en/v1/base/base/#Base.isbits))。许多类型使用非类型参数(例如数组的维数)。 (3认同)