functional-programmingjuliatypesafe

How to pass a function typesafe in julia


Let's say, I want to pass a function to another function:

function foo()
    return 0;
end
function bar(func)
    return func();
end
print(bar(foo));

But you can make functions typesafe:

function func(t::Int)
    print(t);
end
func(0);                 #produces no error
func("Hello world");     #produces an error

I didn't found out, how I combine both, that means, how can I explicitly define a parameter of bar, like func, to be a function, possibly with certain input / output argument types.

Thanks in advance for any help.


Solution

  • A function is of type Function. You can easily check this:

    julia> foo() = 1;
    
    julia> T = typeof(foo)
    typeof(foo)
    
    julia> supertype(T)
    Function
    
    julia> foo isa Function
    true
    

    This will not necessarily cover all callable types, as you can make any type callable:

    julia> struct Callable end
    
    julia> (::Callable)(x::Number) = x + one(x)
    
    julia> callable = Callable()
    Callable()
    
    julia> callable(5)
    6
    
    julia> callable isa Function
    false