问题:Julia是否有严格的子类型运算符?
注意:运算符<:
不是严格的子类型运算符,因为Number <: Number
的计算结果为true
。我感兴趣的是一个运营商,对于false
评估为Number <: Number
,true
评估为Int <: Number
。
可能的用例:考虑定义的函数:
MyFunc{T<:Union(Int, String)}(x::Array{T, 1}, y::Array{T, 1)})
目前,该函数将x
和y
约束为相同类型的数组,其中该类型为Int
,String
或Union(Int, String)
。但是使用严格的子类型运算符,我可以强制输入数组为Int
或String
类型,并消除(相当奇怪的)Union(Int, String)
场景。
答案 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
类型元素的向量,从而最大限度地提高函数的可用性其他程序员。