How to call a vector of functions?

julia> f(x)=x^2
f (generic function with 1 method)

julia> g(x)=x+1
g (generic function with 1 method)

julia> [f,g](3)
ERROR: MethodError: objects of type Vector{Function} are not callable
Use square brackets [] for indexing an Array.
Stacktrace:
 [1] top-level scope
   @ REPL[13]:1

julia> [f,g].(3)
ERROR: MethodError: objects of type Vector{Function} are not callable
Use square brackets [] for indexing an Array.
Stacktrace:
 [1] _broadcast_getindex_evalf
   @ .\broadcast.jl:670 [inlined]
 [2] _broadcast_getindex
   @ .\broadcast.jl:643 [inlined]
 [3] getindex
   @ .\broadcast.jl:597 [inlined]
 [4] copy
   @ .\broadcast.jl:875 [inlined]
 [5] materialize(bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, Vector{Function}, Tuple{Int64}})
   @ Base.Broadcast .\broadcast.jl:860
 [6] top-level scope
   @ REPL[14]:1

julia>

I would expect a result as [f(3),g(3)]. How to do that? Thanks.

julia> [h(3) for h in [f,g]]
2-element Vector{Int64}:
 9
 4
4 Likes

I myself found an answer:

julia> 3 .|> [f,g]
2-element Vector{Int64}:
 9
 4

julia>
7 Likes
using Tullio

f(x)=x^2
g(x)=x+1
k=[f,g]

@tullio a[i] := k[i](3)
println(a)
1 Like

Another way is to use invoke with broadcasting, like so:

julia> f(x)=x^2
f (generic function with 1 method)

julia> g(x)=x+1
g (generic function with 1 method)

julia> v = [f,g]
2-element Vector{Function}:
 f (generic function with 1 method)
 g (generic function with 1 method)

julia> invoke.(v, Tuple{Int}, 3)
2-element Vector{Int64}:
 9
 4
1 Like