方法与嵌套类型限制不匹配

God*_*emo 5 dispatch julia

我有这个简单的方法来计算向量集合的加权平均值

function meanw{T <: Number}(x::AbstractArray{AbstractVector{T}, 1}, w::AbstractVector{T})
  x? = sum(x .* w)
  x? = map(z -> z - x?, x)
  x?, x?
end
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用它时,调度与我的方法不匹配.

ERROR: `meanw` has no method matching meanw(::Array{Array{Float64,1},1}, ::Array{Float64,1})
Run Code Online (Sandbox Code Playgroud)

我怀疑在涉及嵌套时我误解了如何使用类型限制.我应该如何重写此功能以匹配我的收藏?

PS

我知道矢量和数组是相同的,但差异化使得函数的使用更加清晰.

wal*_*uss 4

因此,如果您重写代码以使用具体类型,它就可以工作

\n\n
function meanw{T <: Number}(x::Array{Vector{T}, 1}, w::Vector{T})\n  x\xcc\x84 = sum(x .* w)\n  x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n  x\xcc\x84, x\xcc\x83\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

这也有效

\n\n
function meanw{T <: Number}(x::Array{Vector{T}, 1}, w::AbstractVector{T})\n  x\xcc\x84 = sum(x .* w)\n  x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n  x\xcc\x84, x\xcc\x83\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不起作用

\n\n
function meanw{T <: Number}(x::Array{AbstractVector{T}, 1}, w::AbstractVector{T})\n  x\xcc\x84 = sum(x .* w)\n  x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n  x\xcc\x84, x\xcc\x83\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

这又起作用了

\n\n
function meanw{T <: Number}(x::AbstractArray{Vector{T}, 1}, w::AbstractVector{T})\n  x\xcc\x84 = sum(x .* w)\n  x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n  x\xcc\x84, x\xcc\x83\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们这里遇到的问题在 Julia 手册的参数类型下有描述

\n\n
\n

最后一点非常重要:

\n\n

即使 Float64 <: Real 我们也没有 Point{Float64} <:\n Point{Real}。

\n\n

换句话说,用类型论的说法,Julia\xe2\x80\x99 的类型参数是不变的,而不是协变的(甚至是逆变的)。这是出于实际原因:虽然 Point{Float64} 的任何实例在概念上也可能类似于 Point{Real} 的实例,但这两种类型在内存中具有不同的表示形式:

\n
\n\n

真正起作用的是这个

\n\n
function meanw{T <: Number, V <: AbstractVector}(x::AbstractArray{V, 1}, w::AbstractVector{T})\n  x\xcc\x84 = sum(x .* w)\n  x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n  x\xcc\x84, x\xcc\x83\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

但真正的问题是你为什么要这样做?\n只要输入类型正确并且函数本身类型稳定,即使没有类型注释,Julia 编译器也足够聪明,可以生成高效的代码。只有多重分派才真正需要类型注释,并且作为指定函数实际可以处理的内容的契约,但由于类型系统广泛,这在 Julia 中是非常困难的。

\n