Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Типы данных

В 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.