为何Julia中自定义的median(Function, Any)方法未被匹配?
Julia中Statistics.jl median函数扩展的方法匹配问题
问题描述
我尝试给Statistics.jl的median方法添加以下扩展:
median(f::Function, v) = median(f.(v)) median(f::Function, v::AbstractArray; dims=:) = median(f.(v), dims)
但运行median(abs, [1, -22, 3])时触发错误:
ERROR: MethodError: no method matching median(::Vector{Int64}, ::Colon) Closest candidates are: median(::AbstractArray; dims) @ Statistics ~/github/Statistics.jl/src/Statistics.jl:897 median(::Function, ::Any) @ Main REPL[15]:1 median(::Any) @ Statistics ~/github/Statistics.jl/src/Statistics.jl:881 Stacktrace: [1] median(f::Function, v::Vector{Int64}; dims::Function) @ Statistics ~/github/Statistics.jl/src/Statistics.jl:828 [2] top-level scope @ REPL[17]:1
我不明白为什么Julia没有匹配到median(::Function, ::Any)这个方法,请求帮助。
问题原因与解决方法
核心原因
问题出在方法优先级和参数传递方式上:
- 调用
median(abs, [1, -22, 3])时,Julia会优先匹配**带有关键字参数dims**的median(f::Function, v::AbstractArray; dims=:)方法——因为Vector{Int64}是AbstractArray的子类型,这个方法比median(::Function, ::Any)更具体,方法匹配优先级更高。 - 在该方法中,你将
dims作为位置参数传递给原median函数,但原Statistics.jl的median方法中,dims是关键字参数,而非位置参数,因此触发了方法不匹配的错误。
修正方案
修改带关键字参数的扩展方法,将dims以关键字参数的形式传递给原median函数:
median(f::Function, v::AbstractArray; dims=:) = median(f.(v); dims=dims)
这样就能正确调用原median方法的关键字参数版本,避免位置参数不匹配的问题。
如果想简化代码,还可以合并两个方法,同时支持普通迭代器和数组:
median(f::Function, v; dims=:) = median(f.(v); dims=dims)
对于非数组输入,原median方法会自动忽略无用的dims关键字参数,不影响功能。
内容的提问来源于stack exchange,提问作者Jose Manuel de Frutos
相关产品推荐
相关产品推荐

