2014-12-02 25 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