Как Julia Type Graph обрабатывает массивы? - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь понять структуру массивов в графике типов 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}?

Практическое следствие: как я могу объявить тип абстрактного массива чисел?

1 Ответ

4 голосов
/ 05 апреля 2020

На следующей странице руководства описано, как типы julia инвариантны , а не ковариантны. https://docs.julialang.org/en/v1/manual/types/#Parametric -Composite-Types-1

См., В частности, предупреждение с указанием

Это последнее замечание очень важно: даже если Float64 <: Real У нас НЕ Точка {Float64} <: Point {Real}. </p>

И следующее объяснение, данное

Другими словами, на языке теории типов, Юлия Параметры типа являются инвариантными, а не ковариантными (или даже контравариантными). Это по практическим причинам: хотя любой экземпляр Point {Float64} может быть концептуально похож на экземпляр Point {Real}, два типа имеют разные представления в памяти:

  • Экземпляр Point {Float64} может быть компактно и эффективно представлен в виде непосредственной пары 64-битных значений;

  • Экземпляр Point {Real} должен содержать любое пара экземпляров реального. Поскольку объекты, которые являются экземплярами Real, могут иметь произвольный размер и структуру, на практике экземпляр Point {Real} должен быть представлен в виде пары указателей на индивидуально распределенные объекты Real.

Абстрактный массив с любым числом чисел обозначается так: AbstractArray{<:Number}, что сокращенно от AbstractArray{T} where T <: Number

...