I was trying to write this Enum.reduce([1,2,3], &Kernel.+(&1, &2))
more succinctly and I discovered I could do Enum.reduce([1,2,3]), &(&1 + &2))
.
What is this doing in the background? What kind of expressions can you put in &()
? What is the term for this so I can google more or find the docs?
1 Like
I have heard this mentioned as shorthand notation
for anonymous function
. They are mentioned in the elixir getting started guide under Function capturing: https://elixir-lang.org/getting-started/modules-and-functions.html
The &
is a capture operator (https://hexdocs.pm/elixir/Kernel.SpecialForms.html#&/1)
In your example &(&1 + &2)
translates to fun (x, y) -> x + y end
The &()
“creates” the function and the &1
and &2
means the position of the argument to the function.
If you google elixir shorthand anonymous function
you’ll get better explanations and examples
7 Likes
Ah, Doh. I was awake enough to know +
maps to Kernel.+
but didn’t even consider that Kernel.&
would obviously map to &
…
This is great, I can trim down all those one liner fn (val) -> val == search_target end
functions! That always seemed awkward that Elixir didn’t have a nice clean short hand!
3 Likes
The expression could have been even shorter
Enum.reduce([1, 2, 3], &+/2)
For this specific case, the more succint option is Enum.sum/1
.
The capture is very powerful, you can make things like &"Hello #{&1}"
, also with charlists, tuples, maps, structs…
7 Likes