我正在尝试编写以下类型的并集:
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
我对抽象类型没有信心,也找不到关于类似问题的良好参考。如果您能向我解释如何开展工作以及相对于联盟的优势,我将感到非常高兴。
答案 0 :(得分:1)
在Julia中使用抽象类型无法完成您想做的事情。 Union
是表示您的要求的一种方式。
现在了解为什么要注意在Julia类型系统中您有三个限制:
通过这种方式,我们知道类型会创建树状结构,其根为Any
(Union{}
除外,它没有值,并且是所有其他类型的子类型,但是您将实际上可能不需要这个。)
您的定义将违反规则2和规则3。请注意,所有这些类型均已定义(在Base或包中)-因此您无法重新定义它们(规则3)。而且它们已经具有一个超类型,因此您不能添加另一个(规则2)。例如,查看此调用的结果:
julia> supertype(Array{Float64, 1})
DenseArray{Float64,1}
您会看到Array{Float64, 1}
已经定义并且具有超类型。
已经说过,也许另一个更笼统的定义对您来说就足够了:
const FloatOrMissingVector = AbstractVector{<:Union{Float64, Missing}}
此定义有两个区别:
Vector{Missing}
作为子类型(这样的结构仅包含缺失值)-如果要排除这种情况,则必须按照上面的建议指定并集。