Julia 朱莉娅:用“写一个类型的并集”;“抽象类型”;

Julia 朱莉娅:用“写一个类型的并集”;“抽象类型”;,julia,Julia,我正在尝试编写以下类型的并集: 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 Dat

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

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
抽象类型浮点向量结束

类型数组{Float64,1}在Julia中使用抽象类型无法实现所需的操作<代码>联合
是表示您的需求的一种方式

现在要理解为什么在Julia类型系统中有三个限制:

  • 只有抽象类型才能有子类型
  • 一个类型只能有一个超类型
  • 定义类型时,必须指定类型的超类型
  • 通过这种方式,我们知道类型创建了一个树状结构,其中根是
    Any
    (除了
    Union{}
    ,它没有值,是所有其他类型的子类型,但在实践中可能不需要)

    你的定义将违反规则2和规则3。请注意,所有这些类型都已定义(在Base或包中),因此无法重新定义它们(规则#3)。此外,它们已经有一个超类型,因此您无法添加另一个超类型(规则2)。例如,请参见此调用的结果:

    julia> supertype(Array{Float64, 1})
    DenseArray{Float64,1}
    
    您可以看到,
    数组{Float64,1}
    已经定义,并且有一个超类型

    话虽如此,也许另一个更一般的定义对你来说就足够了:

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

    const FloatOrMissingVector=AbstractVector{谢谢,我想我明白了。您的“FloatOrMissingVector”定义是否适用于数据数组?是的。但是,请注意,
    DataArrays
    已被弃用。请参阅其README.md。谢谢,我错过了!