btimar
btimar

Reputation: 93

Anonymous arguments in julia

Julia permits function and method definitions with unnamed arguments.

This is not mentioned in the functions documentation, nor is it explicitly discussed in the methods documentation. For example:

function myfunc(::Int)
    println("Hello!")
end

How should I describe this behavior (I've googled "anonymous arguments" without success), and when is it useful?

Upvotes: 2

Views: 495

Answers (1)

Bogumił Kamiński
Bogumił Kamiński

Reputation: 69949

This behavior is useful for method dispatch, when you care only about argument type not argument value. Most often this is a case when what you dispatch on is a singleton type.

An example is:

julia> Vector{String}(undef, 3)
3-element Array{String,1}:
 #undef
 #undef
 #undef

This function is defined in the following way:

Array{T,1}(::UndefInitializer, m::Int) where {T} =
    ccall(:jl_alloc_array_1d, Array{T,1}, (Any, Int), Array{T,1}, m)

And you can see that we only care that the first argument was of UndefInitializer type, which is in turn defined as:

struct UndefInitializer end
const undef = UndefInitializer()

We see that UndefInitializer is a singleton type, so we do not care about the value of a variable of this type, but only about its type.

Another common singleton type in Base is Missing. Here are example definitions from Base of standard functions getting a Missing as an argument:

for f in (:(acos), :(acosh), :(asin), :(asinh), :(atan), :(atanh),
          :(sin), :(sinh), :(cos), :(cosh), :(tan), :(tanh),
          :(exp), :(exp2), :(expm1), :(log), :(log10), :(log1p),
          :(log2), :(exponent), :(sqrt))
    @eval $(f)(::Missing) = missing
end

(again - you can see that we do not care about the value of the variable - we know its type is Missing so we return missing)

In the Julia manual you have examples of such methods e.g. here but admittedly as far as I can tell the manual does not give a name for this style of method definition.

Upvotes: 3

Related Questions