Юлия: напишите объединение типов, используя «абстрактный тип» - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь написать следующее объединение типов:

FloatVector = Union{Array{Float64,1}, DataArray{Float64,1}, Array{Union{Float64, Missings.Missing},1}};

с использованием синтаксиса абстрактных типов. В идеале я хотел бы сделать что-то похожее на эту ссылку . Я попробовал ниже, но, к сожалению, это не работает:

abstract type FloatVector end
type Array{Float64,1} <: FloatVector end
type DataArray{Float64,1} <: FloatVector end
type Array{Union{Float64, Missings.Missing},1} <: FloatVector end

Я не уверен в абстрактных типах, и я не смог найти хорошую ссылку на подобную проблему. Я был бы рад, если бы вы могли объяснить мне, как действовать и каковы преимущества перед Союзом.

1 Ответ

0 голосов
/ 31 августа 2018

Невозможно делать то, что вы хотите, используя абстрактные типы в Юлии. Union - это способ представить ваше требование.

Теперь, чтобы понять, почему вы заметили, что в системе типов Julia у вас есть три ограничения:

  1. Только абстрактные типы могут иметь подтипы.
  2. Тип может иметь только один супертип.
  3. Вы должны указать супертип типа при его определении.

Таким образом, мы знаем, что типы создают древовидную структуру с корнем Any (за исключением Union{}, который не имеет значений и является подтипом всех других типов, но вам, вероятно, это не понадобится) на практике).

Ваше определение будет нарушать правило № 2 и правило № 3. Обратите внимание, что все эти типы уже определены (либо в Base, либо в пакете), поэтому вы не можете переопределить их (правило № 3). Также у них уже есть супертип, поэтому вы не можете добавить другой (правило № 2). Смотрите, например, результат этого вызова:

julia> supertype(Array{Float64, 1})
DenseArray{Float64,1}

И вы видите, что Array{Float64, 1} уже определен и имеет супертип.

Сказав, что, возможно, вам будет достаточно другого более общего определения:

const FloatOrMissingVector = AbstractVector{<:Union{Float64, Missing}}

Это определение имеет два отличия:

  1. Он допускает другие, чем плотные векторы (что, я думаю, в любом случае вам и нужно, поскольку обычно вам все равно, является ли вектор плотным или разреженным)
  2. Это позволило бы, например, Vector{Missing} как подтип (то есть структура, содержащая только пропущенные значения) - если вы хотите исключить это, вам нужно будет указать объединение, как вы предложили выше.
...