Will myList always be identical to Map.keys(myMap)? Or will they diverge?
Will Map.values(myMap) always be identical to a list of "no"? Or might there be other values?
In the following solution, I will assume, that myList and Map.keys(myMap) might be different, while the values all have to be "no".
intersection_of_keys = myList -- myOtherList
for {k, v} <- myMap, into: %{} do
if k in intersection_of_keys, do: {k, "yes"}, else: {k, "no"}
end
The reason why your original code did not work is, because the inner binding in the fn you pass to Enum.each/2 does not change the outer binding of myMap, always remember, elixir is immutable, it does only support shadowing, but shadowing does never leak its scope.
Let me be more specific by redefining the problem:
For each key in map_A (we don’t care about the values) get another known map (for example sake: map_B) which is referenced by the key at map_A and test whether any of the keys in map_B matches some variable x. If match, update value at key in map_A to "yes", else "no". And this is the problem.
and I assume in this case that any iterator will not allow this. That goes for Enum.each/2 and:
for x ← some_enumerable do
…
end
I cannot see further than this:
x = "something"
for f <- Map.keys(map_A) do
if(Enum.member?(Map.keys(map_B), x) == true) do
Map.replace(map_A, f, "yes")
else
Map.replace(map_A, f, "no")
end
end
There is no “iterator”. for is a comprehension. Simply speaking it consumes an enumerable and produces a list (or whatever else :into identifies) - it’s an expression like everything else in Elixir, not a statement.
Stop thinking of “variables”- all values in Elixir are immutable. However identifiers can be rebound to new values. So the only thing that can “vary” is the value the identifier is bound to - not the value itself.
Imperative languages are about PLace-Oriented Programming (PLOP) - in functional programming you are programming with values (The Value of Values).
Furthermore you don’t “loop” in Elixir - you recurse.