2014-12-02 23 views
4

问题:朱莉娅是否有严格的亚型操作符?朱莉娅是否有严格的亚型操作符?

注:操作<:严格的亚型运营商,因为Number <: Number评估为true。我对运营商感兴趣,该运营商的评估结果为falseNumber <: Number,但trueInt <: Number

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

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

目前,函数约束着xy是相同的类型,其中该类型是IntString,或Union(Int, String)的阵列。但是对于严格的子类型运算符,我可以强制输入数组的类型为IntString,并消除(相当奇怪的)Union(Int, String)方案。

回答

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类型的元素,最大限度地提高了其他编码器功能的可用性。

+1

有趣的是,谢谢你的回应。我想我会按照你的建议,并使用我自己的功能进行检查。关于用例,我想到的函数对于'String'或'Int'输入都是相同的 - 这可能发生在例如函数只执行大于/小于类型比较的情况下,字符串和数字。所以写出两个相同的方法(仅在输入类型上有所不同)看起来很浪费。但是,由于'Union'类型的数组可能会遇到性能问题,所以消除'Union'情况会很好...... – 2014-12-04 00:35:51

+1

@ColinTBowers:在这种情况下,更“Julian”的方式是指定没有类型在任何情况下 - 那么我可以使用你指定的任何类型的函数(你甚至不知道存在),唯一需要的是实现你的函数需要的任何操作,在这种情况下比比较更大/更小。这个概念通常被称为[duck typing](http://en.wikipedia.org/wiki/Duck_typing),在Julia中被认为是惯用的。 – 2014-12-05 10:01:31

+0

@ColinTBowers我写了一篇文章的更新来阐明我的意思。我希望它有帮助=) – 2014-12-05 10:07:43