pillaiindu
Using a map after do: in a list comprehension
These two work:
iex(1)> for {key, val} <- %{"a" => 1, "b" => 2}, do: {key, val * val}
[{"a", 1}, {"b", 4}]
iex(2)> for {key, val} <- %{"a" => 1, "b" => 2}, into: %{}, do: {key, val * val}
%{"a" => 1, "b" => 4}
But this one gives syntax error:
iex(3)> for {key, val} <- %{"a" => 1, "b" => 2}, do: %{key, val * val}
** (SyntaxError) iex:3:62: syntax error before: '}'
|
3 | for {key, val} <- %{"a" => 1, "b" => 2}, do: %{key, val * val}
| ^
Why?
Why can’t we use map directly after the do: in list-comprehensions?
Most Liked
Kurisu
I think you have a synthax error on the way you’re trying to define the map. It is not about the for or do.
One way you could achieve the map definition would be :
%{“#{key}”: val * val}
or
%{“#{key}” => val * val}
eksperimental
Exactly, the first one works because what he is defining is a tuple, not a map.
pillaiindu
Yes, it’s a tuple not a map, and not even a tuple, because tuple doesn’t have %{. ![]()
I did it accidentally and it took time to catch the mistake. I wanted to see if someone else can catch the mistake, because the error message doesn’t specifically point it out.
%{"#{ isn’t even needed, using key directly works.
for {key, val} <- %{"a" => 1, "b" => 2}, do: %{key => val * val} works.
msimonborg
Your map syntax itself is invalid
iex(1)> {"a", 1} # valid tuple syntax
{"a", 1}
iex(2)> %{"a" => 1} # valid map syntax
%{"a" => 1}
iex(3)> %{"a", 1} # invalid
** (SyntaxError) iex:3:6: syntax error before: ','
|
30 | %{"a", 1}
| ^
Kurisu
Ah you’re right ! ^^
No string interpolation is necessary indeed.
I tought it won’t work for map with atom keys, but it also works as well:
iex(1)> key = :a
:a
iex(2)> %{key => 1}
%{a: 1}
iex(3)>







