Julia 多次调度与子类型不匹配

标签 julia

有人能帮我理解为什么这个 julia 函数定义与我在下面看到的使用它的尝试不匹配吗?

我的天真假设是传递给函数的 Array{ASCIIString,1} 应该与 Array{AbstractString,1} 的函数定义匹配,并且以此类推。

julia> function test(a::Array{AbstractString,1}, b::AbstractString, c::Any) end
test (generic function with 1 method)

julia> test([""],"","")
ERROR: MethodError: `test` has no method matching test(::Array{ASCIIString,1}, ::ASCIIString, ::ASCIIString)
Closest candidates are:
  test(::Array{AbstractString,1}, ::AbstractString, ::Any)

julia>

最佳答案

我认为将我上面的两条评论变成答案是值得的。

正如@DanGetz 所指出的,这里的重要短语是invariant。在这种特殊情况下,这个原则意味着 ASCIIString <: AbstractString计算结果为 true , 但是 Array{ASCIIString, 1} <: Array{AbstractString, 1}计算结果为 false .因此,要使您的问题中定义的函数起作用,您需要传入一个数组 aeltype(a)评估为 AbstractString .传入aeltype(a)评估为 ASCIIString不起作用,因为这不是 Array{AbstractString, 1} 的子类型.

要解决您的问题,您需要类型参数。如果您只想为类型为 b 的情况定义函数匹配 eltype(a) ,那么您将使用:

function test{T<:AbstractString}(a::Array{T}, b::T, c::Any)

如果你想允许 b 的类型不同于eltype(a) , 但强制执行 b成为 AbstractString 的子类型,你会使用:

function test{T<:AbstractString}(a::Array{T}, b::AbstractString, c::Any)

关于Julia 多次调度与子类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37357942/

相关文章:

Julia:使用维度数组调用 Array()

julia - 对传递函数的评估比 julia 中的直接评估慢。有解决方法吗?

plot - 如何推送到 Julia 情节中的特定系列?

arrays - 使用数组 View 时出现意外的内存分配 (julia)

julia - 我如何监控 Julia 和所有 Julia 包的更新?

mathematical-optimization - 尽管数学上不可能,但 Gurobi 报告了无限模型

arrays - 将数组转换为指标矩阵

amazon-s3 - Julia 从 s3 csv 文件加载数据框

python - 是否可以从 Julia 调用 Python 函数并返回其结果?

arrays - 如何在 Julia 中将函数应用于其中包含数组的数据帧?