朱莉娅:使用“抽象类型”写类型的并集

时间:2018-08-30 22:32:46

标签: julia

我正在尝试编写以下类型的并集:

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

使用抽象类型语法。理想情况下,我想做类似于this link的事情。我尝试了以下方法,但不幸的是它不起作用:

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 :(得分:1)

在Julia中使用抽象类型无法完成您想做的事情。 Union是表示您的要求的一种方式。

现在了解为什么要注意在Julia类型系统中您有三个限制:

  1. 只有抽象类型可以具有子类型。
  2. 一个类型只能有一个超类型。
  3. 定义类型时必须指定类型的超类型。

通过这种方式,我们知道类型会创建树状结构,其根为AnyUnion{}除外,它没有值,并且是所有其他类型的子类型,但是您将实际上可能不需要这个。)

您的定义将违反规则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}作为子类型(这样的结构仅包含缺失值)-如果要排除这种情况,则必须按照上面的建议指定并集。