Julia 类型图如何处理数组?

Wil*_*bur 2 julia

我试图了解 Julia 类型图中数组的结构。这对我来说似乎非常违反直觉:

julia> Int64 <: Number
true

julia> Array{Int64,1} <: Array{Number,1}
false

julia> Array{Int64,1} <: Array{Int,1}
true
Run Code Online (Sandbox Code Playgroud)

似乎a <: b还不够Array{a,1} <: Array{b,1}。什么时候 Array{a,1} <: Array{b,1}

一个实用的推论:我如何类型声明一个抽象的数字数组?

Fre*_*gge 5

在手册的下一页中,描述了 julia 的类型如何是不变的,而不是协变的。 https://docs.julialang.org/en/v1/manual/types/#Parametric-Composite-Types-1

请特别参阅警告提示,说明

最后一点非常重要:即使 Float64 <: Real 我们也没有 Point{Float64} <: Point{Real}。

并给出以下解释

换句话说,用类型论的说法,Julia 的类型参数是不变的,而不是协变的(甚至是逆变的)。这是出于实际原因:虽然 Point{Float64} 的任何实例在概念上也可能类似于 Point{Real} 的实例,但这两种类型在内存中具有不同的表示形式:

  • Point{Float64} 的实例可以简洁有效地表示为一对 64 位值的立即数;

  • Point{Real} 的实例必须能够保存任何一对 Real 实例。由于作为 Real 实例的对象可以具有任意大小和结构,因此在实践中 Point{Real} 的实例必须表示为一对指向单独分配的 Real 对象的指针。

具有任何类型数字的抽象数组表示如下 AbstractArray{<:Number},它是AbstractArray{T} where T <: Number

  • 这个答案确实很好,但你可能应该指出,在 64 位系统上,`Int===Int64` (2认同)