A listák az Elixir egyik alapvető adattípusa, amellyel értékek gyűjteményét tárolhatjuk. A listák változtathatatlanok, ami azt jelenti, hogy nem lehet őket módosítani. Minden művelet, ami megváltoztat egy listát, egy új listát ad vissza. A listák megvalósítják az Enumerable protokollt, ami lehetővé teszi az Enum és a Stream modul függvényeinek használatát.
Az Elixirben a listák láncolt listákként valósulnak meg, nem pedig összefüggő memóriaterületek tömbjeként. Ezért egy elem elérése a listában lineáris időt vesz igénybe, a lista hosszától függően.
A listákat felírhatjuk literál formában, fej-farok jelöléssel (amely a cons operátort, a |-t használja), vagy a kettő kombinációjával:
# Literal Form
[]
[1]
[1, 2, 3]
# Head-tail Notation
[]
# same as [1]
[1 | []]
# same as [1, 2, 3]
[1 | [2 | [3 | []]]]
# Mixed
# same as [1, 2, 3]
[1 | [2, 3]]
A cons (|) operátor előtt egynél több elem is állhat.
# Multiple prepends
[1, 2, 3 | [4, 5]]
A fej-farok jelöléssel elemeket fűzhetünk egy listához.
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
Ha egy listához iteráció közben fűzünk elemeket, azt antimintának tekintjük. Egy elem hozzáfűzése azt igényli, hogy végigmenjünk a teljes listán, és az elemet a végére tegyük. Ezért ha minden iterációban új elemet fűznénk hozzá, minden iterációban végig kellene menni a teljes listán.
Ugyanezt az eredményt elérhetjük úgy, hogy az elemet a megfordított lista elejére fűzzük, majd az eredményt megfordítjuk. A lista elejére fűzés gyors művelet, és állandó időt igényel.
# Appending to the end of a list (potentially slow)
[1, 2, 3] ++ [4] ++ [5] ++ [6]
# Prepend to the start of a list (faster, due to the nature of linked lists)
[6 | [5 | [4 | [3, 2, 1]]]]
# then reverse!
Több gyakori Kernel-függvény is létezik a listákhoz:
hd/1 visszaadja egy lista fejét, vagyis a lista első elemét.tl/1 visszaadja a lista farkát, vagyis a listát az első elem nélkül.length/1 visszaadja a listában lévő elemek számát.in/2 Boolean értéket ad vissza, ami megmutatja, hogy az adott elem szerepel-e a listában.Létezik a List modul is.
A listák bármilyen adattípust tartalmazhatnak, és különböző adattípusok keverékét is.
list = [1, :a, 2.0, "string"]