gpt4 book ai didi

types - Julia 有严格的子类型运算符吗?

转载 作者:行者123 更新时间:2023-12-04 20:04:44 24 4
gpt4 key购买 nike

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

注:运营商<:不是严格子类型运算符,因为 Number <: Number评估为 true .我对计算结果为 false 的运算符感兴趣为 Number <: Number但是 trueInt <: Number .

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

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

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

最佳答案

我认为 Julia 中没有这样的运算符,但是编写一个执行相同检查的函数可能会很容易:

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 类型元素的向量,最大限度地提高您的功能对其他编码人员的可用性。

关于types - Julia 有严格的子类型运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27242222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com