( (x,y) -> x+y ).( [ (1,2), (3,4) ] )
gives an error.
Is it possible to apply a multi-variable anonymous function to a vector of tuples like this ?
( (x,y) -> x+y ).( [ (1,2), (3,4) ] )
gives an error.
Is it possible to apply a multi-variable anonymous function to a vector of tuples like this ?
You’re getting an error because your anonymous function takes two arguments, whereas each tuple is only a single argument.
You can use this as the anonymous function instead:
(x -> x[1] + x[2])
Or simply use sum
.
You can use destructuring in the function argument list as follows:
julia> ( ((x,y),) -> x+y ).( [ (1,2), (3,4) ] )
2-element Vector{Int64}:
3
7
Thanks. - always have to add that comma and put in another backet
Heh, whether you should do this is another matter of course. It’s pretty hard to read
can you point out where that is documented?
No. But an anonymous function of a tuple can be applied to a vector of tuples as follows:
jula> (((x, y),) -> x + y).([(1, 2), (3, 4)])
2-element Vector{Int64}:
3
7
This is appoximately equivalent to
julia> f((x, y)) = x + y
julia> f.([(1, 2), (3, 4)])
2-element Vector{Int64}:
3
7
Note that the comma immediately after (x, y)
is not necessary in this case, but it is necessary in the case of the anonymous function above.
You can also get the same result with
julia> (t -> +(t...)).([(1, 2), (3, 4)])
2-element Vector{Int64}:
3
7
Edit: A few minutes late; Julia’s people are too quick to answer!
It’s a consequence of function argument destructuring, combined with anonymous function syntax. Argument destructuring is documented in
https://docs.julialang.org/en/v1/manual/functions/#Argument-destructuring
Actually argument destructuring is not based on pattern matching, it’s based on iteration. So rather than just working for tuples it works for any iterable which is passed:
julia> f((x,y)) = x+y
f (generic function with 1 method)
julia> f(Set([1,2]))
3
julia> f([1,2])
3
julia> f((1,2))
3