Julia多次调度不匹配子类型

时间:2016-05-21 01:15:09

标签: 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>

2 个答案:

答案 0 :(得分:5)

我认为值得将上述两条评论转化为答案。

正如@DanGetz所指出的,这里的重要短语是不变。在这种特殊情况下,此原则意味着ASCIIString <: AbstractString评估为true,但Array{ASCIIString, 1} <: Array{AbstractString, 1}评估为false。因此,对于您的问题中定义的函数,您需要将a数组eltype(a)传递给AbstractString。通过a评估eltype(a)传递ASCIIString不起作用,因为这不是Array{AbstractString, 1}的子类型。

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

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

如果您希望b的类型与eltype(a)不同,但强制bAbstractString的子类型,则可以使用:

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

答案 1 :(得分:1)

自Colin回答以来,Julia的语法发生了变化。从Julia版本1开始,它看起来像这样:

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

请参阅:https://docs.julialang.org/en/v1/manual/methods/#Methods-1