mmport80

mmport80

Nested Updates

A colleague came to me with something similar to the following puzzle,

iex(9)> defmodule Record do defstruct [a: 1, b: 2, c: 3] end

iex(10)> defmodule State do defstruct [d: 4, e: 5, f: %Record{}] end

iex(13)> record1 = %State{}

%State{d: 4, e: 5, f: %Record{a: 1, b: 2, c: 3}}

iex(14)> record1 = %{record1 | f: %Record{c: 9}}

%State{d: 4, e: 5, f: %Record{a: 1, b: 2, c: 9}}

iex(15)> record2 = %{record1 | f: %Record{a: 9}}

%State{d: 4, e: 5, f: %Record{a: 9, b: 2, c: 3}}

iex(16)> record3 = %{record2 | f: %Record{c: 9}}

# problem is here… ":a" is "1" again
%State{d: 4, e: 5, f: %Record{a: 1, b: 2, c: 9}}

iex(17)> record4 = %{record3 | f: %Record{a: 9, c: 9}}

OK, stupid.

I see the problem, we are creating new records each time : )

Interesting how trying to explain a problem, also solves it : ))

Most Liked

peerreynders

peerreynders

I think you may be seeing the remnants of a statement based mindset. Because from the script it isn’t clear whether you actually wanted different records or whether you are simply advancing the state of the same conceptual record - for which Elixir does allow rebinding.

The script still has that imperative “do this, then do that” kind of feel (which is typical for scripts anyway but I assume that the original code looked like that as well).

I personally have no qualms having lots of well-named single line functions that also use argument pattern matching for destructuring; essentially allowing for “composed functions” (not necessarily in the FP sense and not always with the pipeline operator) so that if possible the code can look more like a progressive flow of value transformations rather than some step by step recipe.

Last Post!

mmport80

mmport80

yeh normally I do |> all the way, and (luckily) never find myself in this situation…

Where Next?

Popular in Questions Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New

Other popular topics Top

dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40165 209
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44778 311
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44265 214
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New

We're in Beta

About us Mission Statement