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