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. 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!? >