Списки - це базовий тип даних в Elixir для зберігання колекції значень. Списки незмінні, тобто їх не можна змінити. Будь-яка операція, що змінює список, повертає новий список. Списки реалізують протокол Enumerable, який дає змогу використовувати функції модулів Enum і Stream.
Списки в Elixir реалізовано як звʼязані списки, а не як масиви суміжних ділянок памʼяті. Тому доступ до елемента в списку займає лінійний час, що залежить від довжини списку.
Списки можна записувати в літеральній формі, у нотації «голова-хвіст» (яка використовує оператор cons |) або як комбінацію обох:
# 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]]
Перед оператором cons (|) також може стояти більше ніж один елемент.
# Multiple prepends
[1, 2, 3 | [4, 5]]
Нотацію «голова-хвіст» можна використовувати, щоб додавати елементи в кінець списку.
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
Додавання елементів у кінець списку під час ітерації вважається антипатерном. Щоб додати елемент у кінець, потрібно пройти весь список і додати елемент у самому кінці, тому додавання нового елемента на кожній ітерації вимагало б проходження всього списку на кожній ітерації.
Того самого результату можна досягти, додавши елемент на початок перевернутого списку, а потім перевернувши результат. Додавання на початок виконується швидко й потребує сталого часу.
# 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!
Є кілька поширених функцій Kernel для роботи зі списками:
hd/1 повертає голову списку, тобто перший елемент списку.tl/1 повертає хвіст списку, тобто список без першого елемента.length/1 повертає кількість елементів у списку.in/2 повертає булеве значення (англ. Boolean), яке вказує, чи є елемент у списку.Є також модуль List.
Списки можуть містити будь-який тип даних і суміш різних типів даних.
list = [1, :a, 2.0, "string"]