Can one override method ambiguity?

I have an API for which the user defines methods for a function, to dispatch on user-defined types.

However, when the second argument is nothing, I want this method to return nothing without the user defining a method for the intersection. MWE:

abstract type ModelType end
struct Bar <: ModelType end
estimate(::Bar, ::Any) = 1
# I want do dispatch to the one below when possible
# WITHOUT DEFINING estimate(::Bar, ::Void)
estimate(::Any, ::Void) = nothing 
estimate(Bar(), nothing)             # this is ambigous

Is this possible somehow?

1 Like

I constantly run into similar issues, where Julia considers that both are equally specific, so it can’t decide between them, not just with nothing.
For your API, you couldn’t leave off the last argument for the “nothing” case, or is it that it might not be the last argument?

The way i usually work around this is with a function barrier, where the user defines a method for the “inner” function

estimate(a, b) = inner_estimate(a,b)
estimate(a, ::Void) = nothing

example in the wild: https://github.com/Evizero/Augmentor.jl/blob/master/src/operation.jl#L58-L86

9 Likes

This is so useful and elegant that IMO it deserves a place in the documentation.

3 Likes