Юлия многократная отправка не соответствует подтипам

Может ли кто-нибудь помочь мне понять, почему это определение функции 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>

1 ответ

Решение

Я думаю, что стоит превратить мои два комментария выше в ответ.

Как указал @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), но применять b быть подтипом AbstractString, вы бы использовали:

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

После ответа Колина синтаксис Джулии изменился. Начиная с Юлии версии 1, это выглядит так:

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

См. https://docs.julialang.org/en/v1/manual/methods/

Другие вопросы по тегам