这个函数的参数类型到底要怎么设置

MethodError: no method matching match_all_points(::Dict{Array{Int64,1},Array{Array{Float64,1},1}})

给这个函数传递的是::Dict{Array{Int64,1},Array{Array{Float64,1},1}}
而编译器需要的是

 match_all_points(::Dict{Array{Number,1},Array{Array{Number,1},1}}) 

我现在有点搞不懂这个类型转换了

match_all_points(::Dict{Array{T1,1}, Array{Array{T2,1},1}}) where {T1<:Number, T2<:Number} = nothing
match_all_points(::Dict{Vector{T1}, Vector{Vector{T2}}}) where {T1<:Number, T2<:Number} = nothing

Point 不同 T 值所声明的具体类型之间,不能互相作为子类型:
最后一点 非常 重要:即使 Float64 <: Real没有 Point{Float64} <: Point{Real}

换成类型理论说法,Julia 的类型参数是 不变的 ,而不是协变的(或甚至是逆变的)。这是出于实际原因:虽然任何 Point{Float64} 的实例在概念上也可能像是 Point{Real} 的实例,但这两种类型在内存中有不同的表示

—— 参数复合类型 · Julia中文文档

julia> Array{Int64,1} <: Array{Number,1}
false

julia> Array{Int64,1} <: Array{T,1} where T<:Number
true

julia> Array{Int64,1} <: Array{<:Number,1} # 只有一个类型变量时可以这样写
true

最后一种写法不建议,容易出问题。自己写类型约束时,都写在最外层。

julia> Vector{Vector{Int64}} <: Vector{Vector{<:Number}}
false

julia> Vector{Vector{<:Number}}
Array{Array{#s2,1} where #s2<:Number,1}

julia> Vector{Vector{Int64}} <: Vector{Vector{T}} where T<:Number
true

(我记得有帖子讨论过最后这个问题,但一时半会找不到了

还是这B样

你确定你改了?
图中的候选函数签名还是没有改。

报错的函数你没改吧。

你改了 match_all_points,报错的是 match_pair
看起来 PointEdge 的定义你没改。

这个类型写得好麻烦
对这种指定类型的,又要引入泛型的情况,有没有指定泛型的类型别名的办法

比较优雅的写法

julia> Point{T} = Vector{T}
Array{T,1} where T

julia> Edge{T} = Vector{Vector{T}}
Array{Array{T,1},1} where T

julia> Dict{Point{T1}, Edge{T2}} where {T1<:Number, T2<:Number}
Dict{Array{T1,1},Array{Array{T2,1},1}} where T2<:Number where T1<:Number

julia> PE_Dict{T1,T2} = Dict{Point{T1}, Edge{T2}}
Dict{Array{T1,1},Array{Array{T2,1},1}} where T2 where T1

julia> f(::PE_Dict{T1,T2}) where {T1<:Number, T2<:Number} = nothing
f (generic function with 1 method)

julia> Dict{Array{Int64,1},Array{Array{Float64,1},1}}() |> f

或者直接给 Dict 整体一个名字

julia> PE_Dict = Dict{Array{T1,1}, Array{Array{T2,1},1}} where {T1<:Number, T2<:Number}
Dict{Array{T1,1},Array{Array{T2,1},1}} where T2<:Number where T1<:Number

julia> Dict{Array{Int64,1},Array{Array{Float64,1},1}}() isa PE_Dict
true

其他失败的尝试:

julia> Point  = Vector{T} where T <: Number
Array{T,1} where T<:Number

julia> Edge = Vector{Vector{T}} where T <: Number
Array{Array{T,1},1} where T<:Number

julia> Dict{Point, Edge}
Dict{Array{T,1} where T<:Number,Array{Array{T,1},1} where T<:Number}

julia> Dict{Array{Int64,1},Array{Array{Float64,1},1}}() isa Dict{Point, Edge}
false


julia> Point  = Vector{<:Number}
Array{#s1,1} where #s1<:Number

julia> Edge = Vector{Vector{<:Number}}
Array{Array{T,1} where T<:Number,1}

julia> Dict{Point, Edge}
Dict{Array{#s1,1} where #s1<:Number,Array{Array{T,1} where T<:Number,1}}

julia> Dict{Array{Int64,1},Array{Array{Float64,1},1}}() isa Dict{Point, Edge}
false

京ICP备17009874号-2