On Wed, Aug 26, 2015 at 12:33 PM, Matt Bauman <[email protected]> wrote:
> Yes, this can be surprising.  Look at `methods(u)`:
>
> julia> methods(u)
> # 5 methods for generic function "u":
> u(c::Float64) at none:7
> u(c::Float64, h::Float64) at none:3
> u(c::Float64, h::Float64, b) at none:3
> u(c::Float64, h::Float64, b, a) at none:3
> u(c::Float64, a) at none:7
>
> When you call `u(2.)`, it fills in the missing argument and then *calls `u`
> again*, with two arguments.  Since `a` is a Float64, when it does this, the
> method that's dispatched to isn't from the second definition (on psuedo-line
> 7), but rather the first definition (line 3).  It's just a little tricky
> that the convenience methods that are generated for optional arguments might
> re-dispatch to a completely different definition.

This sounds like a bug for me. We should probably use a inner method
just like what we do for keyword argument.

>
> On Wednesday, August 26, 2015 at 12:22:19 PM UTC-4, Nils Gudat wrote:
>>
>> I'm defining a function with two methods as follows:
>>
>> a = 2.
>> b = 0.8
>>
>> function u(c::Float64, h::Float64, b=b, a=a)
>>     ((c/(h^b))^(1-a))/(1-a)
>> end
>>
>> function u(c::Float64, a=a)
>>      c^(1-a)/(1-a)
>> end
>>
>> However, when calling u(2.), the result is -0.87..., which should be the
>> result of the function call u(2., 2.).
>> Clearly I misunderstand how multiple dispatch is working here - I thought
>> when defining a function f() with one method f(::Float64), and another
>> method f(::Float64, ::Float64), the two-argument version would only be
>> called if I'm actually supplying two arguments!?

Reply via email to