[erlang-questions] How to keep adding items to a data structure

Raimo Niskanen raimo+erlang-questions@REDACTED
Mon Apr 25 12:32:36 CEST 2016

On Sun, Apr 24, 2016 at 05:24:05PM -0400, Donald Steven wrote:
> Thanks Oliver, I appreciate your note. I understand that a list can 
> contain different elements, as you've indicated.  That's wonderful! And 
> I have that book on order.  What I'm so frustrated by is, apparently, in 
> order to extend a list by adding new musical events, that I have to keep 
> creating new lists, like:
> List1 = [musical-event],
> List2 = List1 ++ [new-musical-event],
> List3 = List2 ++ [new-musical-event],
> List4 = List3 ++ [new-musical-event],
> etc.
> all the way to perhaps a few thousand.  This is primitive and absurd.  I 
> need a better solution, whether it's a list or an array or a record.

Well, if you do it that way you do it the primitive and absurd way.

Lists are single linked and that is a feature.  You should add to the head
of the list since that is the end that is accesible in constant time:
  List1 = [musical_event],
  List2 = [new_musical_event|List1],
  List3 = ...

Regarding the names List1, List2, List3, ... that is a consequence of
having single assignment variables, which also is a feature.  It stems from
normal mathematical notation where this is gibberish:
  I = I + 1
You really mean
  I_1 = I_0 + 1
where _N often is written as a subscript to indicate that these are
different instances of a variable.

We programmers then after learning imperative programming such as C get
used to '=' meaning a destructive update of a memory location, which is
just the kind of low level concept that functional programming wants to
avoid talking about.

The compiler will figure out that List1 is not used after List 2 = ...
and hence not keep that value around so you really just prepend to the same
list and end up with just the last list List4.

But normally you just prepend one item to the head and then iterate through
recursion so you do not need to name that many instances of a variable
within one function clause.

I hope that helped somewhat.

/ Raimo Niskanen, Erlang/OTP, Ericsson AB

More information about the erlang-questions mailing list