Julia有一个严格的子类型运算符吗?

时间:2014-12-02 05:05:26

标签: types julia

问题:Julia是否有严格的子类型运算符?

注意:运算符<: 是严格的子类型运算符,因为Number <: Number的计算结果为true。我感兴趣的是一个运营商,对于false评估为Number <: Numbertrue评估为Int <: Number

可能的用例:考虑定义的函数:

MyFunc{T<:Union(Int, String)}(x::Array{T, 1}, y::Array{T, 1)})

目前,该函数将xy约束为相同类型的数组,其中该类型为IntStringUnion(Int, String)。但是使用严格的子类型运算符,我可以强制输入数组为IntString类型,并消除(相当奇怪的)Union(Int, String)场景。

1 个答案:

答案 0 :(得分:4)

我不认为朱莉娅有这样的操作员,但编写一个执行相同检查的功能可能很容易:

strictSubType{T,U}(::Type{T}, ::Type{U}) = T <: U && T != U # note: untested!

但是,我必须质疑你的用例。如果您真正想要的是

function my_func{T<:String}(x::Vector{T}, y::Vector{T})
    # handle strings
    # note that String is an abstract type, inherited by e.g. ASCIIString and UTF8String
end

function my_func(x::Vector{Int}, y::Vector{Int})
    # handle ints
    # note that Int is a concrete type (actually an alias for either Int32 or Int64,
    # depending on your platform) so no generic type parameter is necessary
end

然后写下来。如果您拥有可以共享的逻辑部分,请将其重构为单独的方法,您可以放松类型参数(或完全省略它们)。

更新,以回复您的评论:

如果这两个方法应该完全相同,那么你可能最好使用duck typing,而根本不指定函数参数的类型:

funciton my_func(x, y)
    # handle ints, strings and anything else that supports things you need (e.g. > and <)
end

Julia将为您调用的每种类型组合编译特定方法,因此您仍然可以获得同样快速的代码;如果函数是类型稳定的,那么任何组合都会很快(请参阅Julia文档以获得有关其工作原理的更全面的解释)。如果你想确保两个参数是向量,并且它们属于同一类型,我建议做对角线调度(在文档中也有更全面的解释):

function my_func{T}(x::AbstractVector{T}, y::AbstractVector{T})
    # handle stuff
end

请注意,我使用AbstractVector而不是Vector - 这允许使用其他容器类型,其行为类似于具有T类型元素的向量,从而最大限度地提高函数的可用性其他程序员。