# Standard function definition
function f(x, y)
    return x + y
end

# Function implicitly returns the value of the last line
# of the function so no return keyword is required
function g(x, y)
    x - y
end

# Functions can be defined one one line like this.
# This is just a shorthand and is compiled identically to the ones above
h(x, y) = x * y


# Can enforce types on function arguments and return value
# This makes it possible to create multiple functions
# with the same name but different types; These are called methods
f(x::Float64, y::Float64)::Float64 = x / y


# Runs the generic method of the function at the top of the file
println(f(2, 3))

# Runs the specific method defined for two Float64.
println(f(2.2, 3.2))

# Also falls back the the generic method as input is (::Float64, ::Int64)
println(f(1.6, 3))