Алгебраические типы. Возможности Типа суммы Enum

А

Алгебраические типы: что это?

Алгебраические типы.. Те кто знаком с Haskell, возможно, найдут в этом что то знакомое. Однако что бы понять их, не нужно быть профессором математики. Алгебраические типы — это не новые типы. Это просто новый способ восприятия уже известных типов. В данной статье мы рассмотрим два основных алгебраических типа, и особое внимание уделим Типу суммы в связке с Enum

Существует множество алгебраических типов. Вообще то, все типы, что вы используете — алгебраические. В этой статье мы рассмотрим два основных алгебраических типа: Тип произведения (Product-type) и Тип суммы (Sum-type). Итак, приступим.

Алгебраические типы: Тип произведения

Product-type — это ни что иное, как Swift-struct тип или же Java-class тип. Их называют Типами произведения, так как число возможных значений, которые они могут иметь — это произведение числа возможных значений их составной части:

Посмотрите пример. Bool может иметь 2 возможных значения. ProductExample-структура имеет 2 Bool-типа. Мы можем получить число возможных значений ProductExample путем умножения количества значений Bool «a» на количество значений Bool «b». Таким образом, число возможных значений ProductExample — 2 * 2 = 4:

Посмотрим другой пример:

ProductExampleTwo имеет ряд возможных значений, кратный Bool и Int8. Int8 имеет 256 возможных значений, а Bool — 2 значения. Таким образом, у ProductExampleTwo 512 возможных значений.

В общем, не вдаваясь в теорию обозначения типов, мы можем определить функцию Npv, возвращающую число возможных значений типа. Таким образом:

enum

То что String имеет бесконечное количество значений несет определенные последствия для нашего восприятия типов, но для данной статьи это можно опустить без ущерба для общего посыла.

Если мы используем Npv-функцию, мы можем выразить общий случай для всех Типов произведения.

Давайте предположим, что у нас есть тип T, который имеет составные части T1, T2, T3, …, Tn. T можно рассматривать как тип произведения если:

enum

… или, если записать более правильно:

enum

Алгебраические типы: Тип суммы

Если в Swift Тип произведения — это структура, то что же является Типом суммы? — Перечисления, Enums!

Число возможных значений Типа суммы — это сумма числа возможных значений его (типа) составных частей.

Теперь, когда у нас есть некоторое понимание о типах с алгебраической точки зрения, и у нас есть Npv-функция, давайте рассмотрим Тип суммы на примерах.

Давайте рассмотрим все возможные варианты создания экземпляра перечисления SumExample:

Есть 4 варианта создания экземпляра SumExample-перечисления. Это число мы получили, исходя из того, что Npv(Bool) = 2, и число Bool-переменных у нас тоже 2. 2+2 = 4.

Давайте рассмотрим другой пример:

Какое же число возможных значений SumExampleTwo? Это сумма возможных значений Bool и Int8:

enum

Выражая общий случай:

Давайте предположим, что у нас есть тип T, который имеет составные части T1, T2, T3, …, Tn. T можно рассматривать как тип суммы если:

enum

… или, если записать более правильно:

enum

Алгебраические типы: Как их использовать с Enum для повышения качества кода? 

Теория, это хорошо, но давайте рассмотрим несколько практических примеров. Перед тем, как мы пойдем дальше, запомните «мантру»: Число возможных значений вашего типа должно быть равно количеству случаев использования.

Перечисление результатов.

Что это означает? Давайте предположим, что вы делаете REST-запрос и получаете обратно какую то строку (String) как результат. Плохим вариантом написать это будет:

Почему это плохой вариант? Потому что наш случай использования имеет два возможных значения:

  • Успех — результат был получен с сервера.
  • Ошибка — что то пошло не так в процессе.

И наша реализация имеет 4 возможных значения:

Мы должны думать о семантике данного подхода. На самом деле, мы рассчитываем только на два случая: Case 1 и Case 2. То есть — нам нужно только либо результат без ошибок, либо отсутсвие результата и ошибка.

Проблема в том, что мы используем Тип произведения там где должны использовать тип суммы. Решение?

Мы создали Тип суммы под названием Result и используем его, что бы иметь два возможных результата. Таким образом, случаи использования соответствуют нашей реализации.

Необязательное перечисление.

Вы могли не знать, но Swift имеет встроенный тип суммы, которую мы используем почти всегда: Optional.

Можно придумать разные реализации опционалов в Swift, например для enum:

Так создание опциональной строки let a: String? = «Hello» можно сократить до let a = Optional.some(«Hello»).

Хорошо, что Swift имеет красивый синтаксис, помогающий различать типы сумм — if-let и guard-let конструкций.

Это:

эквивалентно этому:

Реализация структуры данных.

Реализация «деревьев» и связанных списков с использованием Типов суммы в Swift невероятно простая:

Шаблон для темы.

Вы можете использовать Тип  суммы для реализации шаблона для смены темы (например, с темной на светлую) в вашем приложении.

 

 

Поддержите ресурс blog.justDev:

Сведения об авторе

Игорь Малеваный

Добавить комментарий

Instagram

Поддержите ресурс blog.justDev:

Свежие записи

Рубрики