【发布时间】:2020-03-20 08:12:30
【问题描述】:
有人能帮我理解为什么这个 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>
【问题讨论】:
-
原因是 Julia 类型是 invariant 这意味着
issubtype(Array{ASCIIString,1},Array{AbstractString,1})是假的。更多信息请查看docs.julialang.org/en/release-0.4/manual/types/…。 -
这是this question 中问题的一个简单示例。然而,这个问题的呈现方式有很大的不同,我投票认为我们保持开放。为了快速参考,您需要的语法是
function test{T<:AbstractString}(a::Array{T}, b::T, c::Any),但如果您希望a的元素类型与b的类型不同,您可能需要第二个类型参数... -
糟糕,忽略我之前评论中关于“第二类型参数”的废话。如果你想让
a的元素类型和b的类型不同,那么function test{T<:AbstractString}(a::Array{T}, b::AbstractString, c::Any)就足够了。关键是ASCIIString <: AbstractString是true,而Array{ASCIIString, 1} <: Array{AbstractString, 1}是false。
标签: julia