This question and the responses help illustrate for me the points made at the great blog post by Chris Rackauckas on type dispatch in Julia.
I have collated the responses into the following code:
# I ran this only in Julia 1.0.0.
## ========== Original function ==========
## function bigfunction(x::Vector, y::Float64=0.5)
## # lots of stuff
## z = x .+ y
## return z
## end
## bigfunction(x::Number) = bigfunction()
## println(bigfunction([0, 1, 3]))
## println(bigfunction(2))
## ---------- Output has ERROR ----------
## [0.5, 1.5, 3.5]
## ERROR: LoadError: MethodError: no method matching bigfunction()
# ========== Answer Suggested by Picaud Vincent in comments ==========
# Note use of Union in function signature.
function bigfunction(x::Union{Vector, Number}, y::Float64=0.5)
# lots of stuff
z = x .+ y
return z
end
println(bigfunction([0, 1, 3]))
println(bigfunction(2))
## ---------- Output Okay ----------
## [0.5, 1.5, 3.5]
## 2.5
# ========== Answer Suggested by Robert Hönig in comments ==========
# Note change in line right after function definition.
function bigfunction(x::Vector, y::Float64=0.5)
# lots of stuff
z = x .+ y
return z
end
bigfunction(x::Number) = bigfunction([x])
println(bigfunction([0, 1, 3]))
println(bigfunction(2))
## ---------- Output Okay ----------
## [0.5, 1.5, 3.5]
## 2.5
# ========== Answer Suggested by Chris Rackauckas ==========
# Note change in function signature using duct typing--no type for x.
function bigfunction(x, y=0.5)
# lots of stuff
z = x .+ y
return z
end
println(bigfunction([0, 1, 3]))
println(bigfunction(2))
## ---------- Output Okay ----------
## [0.5, 1.5, 3.5]
## 2.5
function bigfunction(x::Union{Vector,Number}, y::Float64=0.5)
should do what you want – Smutchybigfunction(x::Number) = bigfunction([x])
. This style may prove cleaner. – Doorstonebigfunction
in the future could easily break it if the author is not careful to make sure each new line is compatible with both a vector or number input. Robert's approach sidesteps this very neatly (I use idiom's like it a lot in my code). – Yazziey
to be aFloat64
? Now the function will not work ify
is an integer, a complex, a single precision float, etc. Considery::Number
ory::Real
. I don't know whatbigfunction
is supposed to do, but consider whether you can define it for(x::Number, y::Number=0.5)
, and then use broadcasting, that is, callbigfunction.(x, y)
(with a dot) whenx
is an array. – Maeda