julia - Julia 类型图如何处理数组?

标签 julia

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

julia> Int64 <: Number
true

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

julia> Array{Int64,1} <: Array{Int,1}
true

看来a <: b不足以 Array{a,1} <: Array{b,1}Array{a,1} <: Array{b,1}什么时候?

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

最佳答案

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

特别请参阅警告说明

This last point is very important: even though Float64 <: Real we DO NOT have Point{Float64} <: Point{Real}.

并给出以下解释

In other words, in the parlance of type theory, Julia's type parameters are invariant, rather than being covariant (or even contravariant). This is for practical reasons: while any instance of Point{Float64} may conceptually be like an instance of Point{Real} as well, the two types have different representations in memory:

  • Point{Float64} 的实例可以紧凑而高效地表示为一对直接的 64 位值;

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

具有任何类型数字的抽象数组都表示为这样 AbstractArray{<:Number}这是 AbstractArray{T} where T <: Number 的缩写

关于julia - Julia 类型图如何处理数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61038884/

相关文章:

julia - Julia 中的有理矩阵除法

c++ - 从 Julia 调用具有 std::vectors 作为输入和输出参数的 C++ 函数

julia - 在 Julia 中获取嵌套数组的形状

types - 防止 Julia 自动转换一维矩阵切片的类型

matplotlib - Julia Plots : PyCall. PyError("PyImport_ImportModule\n\npyimport 找不到 Python 包 matplotlib.pyplot

julia - 我们可以在 Julia 中自定义文件打开缓冲区大小吗

julia - 在 Julia 中找到小于 n 的下一个二的幂

julia - Julia 非线性最小二乘包中的 Levenberg-Marquardt

julia - 检查夏令时 (DST) 是否对 Julia 有效

julia - Flux.jl 中的交叉熵损失 - Julia