astery
Why `<-` listed as `Left` associativity operator in elixir docs?
Here is the list and it is at the bottom of the table.
I would expect that <- would have a right associativity like =. Because in both operators when we match statements:
{:ok, _} = Some.function()
and
with {:ok, _} <- Some.function() do
# ...
end
Pattern is on the left side and one evaluated is on the right. So I’ve expected Right associativity.
What’s wrong with my reasoning?
Marked As Solved
IvanIvanoff
Associativity plays a role when multiple operators are chained. It controls the order of grouping operands to operators with the same precedence.
= being with Right associativity means that a = b = 10 will be evaluated as (a = (b = 10)) and not as ((a = b) = 10).
- is also left associative, meaning that 5 - 4 - 3 is evaluated as ((5 - 4) - 3) == -2. If it was right associative it would have been evaluated as (5 - (4 - 3)) == 4.
When the operator is used a single time, the associativity does not play a role – 5 - 3 == 2 no matter if - is left or right associative
<- is left associative not only in the docs, but also in the parser. So there is no error in the documentation.
I was not able to actually come up with an example where multiple <- are chained, something like this does not work:
with a <- b <- 10 do
{a, b}
end
If I had to guess before looking it up, I would have guessed that <- is non-associative. Example for non associative operator is the unary not. A single not true is valid, but chaining multiple nots is not: not true not false is a syntax error.
Also Liked
IvanIvanoff
In these examples of with and for the comma , separates the expressions. The comma itself is left associative, which is what controls the order of evaluation.
You can check that by replacing the left associative <- with the right associative = and still being able to use the result of the previous results:
with a = 5,
b = a + 10,
c = b + 20 do
{a, b, c}
end
# => {5, 15, 35}
Last Post!
IvanIvanoff
In these examples of with and for the comma , separates the expressions. The comma itself is left associative, which is what controls the order of evaluation.
You can check that by replacing the left associative <- with the right associative = and still being able to use the result of the previous results:
with a = 5,
b = a + 10,
c = b + 20 do
{a, b, c}
end
# => {5, 15, 35}
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex










