Типы данных
В Unison есть не только базовые типы данных. В базовой библиотеке есть несколько очень полезных типов (называемых «коллекциями»), без которых сложно представить современную разработку, и сейчас вы узнаете о них.
Списки
Очень часто нам нужно хранить несколько объектов в одном месте (например, список студентов в группе). Для этого в Unison есть нативный тип данных - List. Он может хранить в себе несколько объектов одного типа. Под капотом список реализован как Finger Tree («Пальчиковое дерево»), что дает моментальный доступ к первому и последнему элементу, а также относительно быстрые вставку, удаление и соединение двух списков. Ниже будут примеры создания и использования списков:
1 | > List.empty
⧩
[]
2 | > []
⧩
[]
3 | > List.singleton 1
⧩
[1]
4 | > [1]
⧩
[1]
5 | > List.fill 3 "hello"
⧩
["hello", "hello", "hello"]
6 | > 1 +: [2, 3, 4]
⧩
[1, 2, 3, 4]
7 | > [1, 2, 3] :+ 4
⧩
[1, 2, 3, 4]
8 | > List.size [1, 2, 3, 4, 5]
⧩
5
9 | > List.insertAt 1 4 [1, 2, 3]
⧩
[1, 4, 2, 3]
10 | > List.replace 0 4 [1, 2, 3]
⧩
[4, 2, 3]
11 | > List.deleteAt 2 [1, 2, 3, 4]
⧩
[1, 2, 4]
12 | > [1, 2, 3] ++ [4, 5, 6]
⧩
[1, 2, 3, 4, 5, 6]
13 | > List.head [1, 2, 3]
⧩
Some 1
14 | > List.tail [1, 2, 3]
⧩
Some [2, 3]
15 | > List.last [1, 2, 3]
⧩
Some 3
16 | > List.reverse [1, 2, 3, 4]
⧩
[4, 3, 2, 1]
Много текста, разберем все по порядку:
- Создать список можно несколькими способами:
- Через [];
- Через List.empty;
- Через List.singleton (в списке будет 1 элемент);
- Через List.fill (тогда в списке будет N одинаковых элементов)
- Через List.tabulate, первым аргументом передаем число, до которого будет идти счет (в нашем случае будет от 0 до 4), и функцию, в которую каждое число из ряда будет передавать, а результат функции будет добавлять в список. Вот пример:
18 | > List.tabulate 5 (x -> x * 3) ⧩ [0, 3, 6, 9, 12] - Добавлять элементы к списку в начало и в конец через операторы List.+: и List.:+ соответственно;
- Получать количество элементов через List.size;
- Соединять два списка через оператор ++;
- Вставлять, заменять или удалять элементы по индексу через List.insertAt, List.replace и List.deleteAt соответственно (в сигнатурах первое число - индекс элемента);
- Переворачивать список через List.reverse;
- А также получать элементы списка:
- List.head возвращает первый элемент;
- List.tail возвращает все, кроме первого элемента;
- List.last возвращает последний элемент;
Как вы можете заметить, результат функции не просто <элемент>, а Some <элемент>. Это - особый тип, который показывает, что элемент действительно есть (ведь, допустим, мы не можем взять первый элемент из пустого массива). В отличии от Java, C++ или Python, в Unison нет такого понятия, как null. Чуть позже мы разберем все эти типы, как они работают, для чего они нужны и что они предотвращают.
А пока что вернемся к особой функции в списках - List.map.