purplesquirrel
How does &(&1 + &2) work?
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?
Most Liked
cmkarlsson
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 
rodrigues
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… 
purplesquirrel
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!








