У меня есть история для исследования того, может ли Цирцея полиморфно анализировать объекты Json в ADT. Один из вопросов, который я получил, был: что такое ADT?

Я пробормотал пару минут, понимая, что не могу сказать конкретного объяснения того, что такое ADT.

После того, как меня вызвали перед стендом, я решил, что должен понять, что такое алгебраические типы данных - и я думаю, что эти знания необходимы и часто используются во многих приложениях функционального программирования.

Цитировать Элвин Александр -

Алгебраические типы данных не являются способом упреждающего проектирования кода FP (функционального программирования); вместо этого они позволяют категоризировать уже написанные вами модели данных, особенно модели данных FP.

Обычно мы знакомы с ADT во многих моделях данных FP, таких как тип Enumeration (Enum) в ООП. Однако ADT представляет собой более широкую категорию, чем просто Enums.

Одно из преимуществ написания ADT:

  1. заключается в том, что вы можете выполнять стиль программирования с сопоставлением с образцом.
  2. Ваш код становится более «алгеброй»

Что означает «алгебра»?

Многие из нас знают алгебру, с которой сталкиваются в старшей школе. Пример:

Это числовая алгебра.

Однако, изучая больше ФП, вы поймете, что алгебра состоит из двух характеристик:

  1. Набор предметов
  2. Операции, примененные к этим объектам для создания новых объектов

В случае числовой алгебры, например, 1 - это набор объектов числовых типов, а операторы - +. Следовательно, 2 состоит из 1 числовых типов, которые применяются с операторами +.

Кроме числовой алгебры существуют различные алгебры. Есть реляционная алгебра, которая используется в базе данных. В реляционной алгебре таблица представляет собой набор объектов, а такие операторы, как SELECT, AS, представлены как операторы. Вы можете увидеть больше видов алгебры здесь.

Как алгебра работает в программировании?

Скорее всего, вы уже работали над ADT, даже если не знаете об этом. Приведенный выше пример представляет алгебру в программировании из-за набора объектов (целые числа x и y) и операторов конструктора (класс case), которые создают новый тип (координаты)

В scala есть 3 типа ADT:

Типы сумм - обычно с запечатанными типажами и объектами case.

Типы суммы также называют типом перечисления, потому что вы перечисляете все возможные экземпляры из базового типа. Обычно вы формулируете эти типы с помощью «is a» и «or».

Типы продуктов - класс корпуса

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

Пример:

Сколько комбинаций нужно учитывать для этого?

В данном случае это 2 * ²⁵⁶, потому что у целого числа столько возможностей.

Гибрид - сумма и тип продукта, закрытый признак с классом случая

Гибридные типы следуют запечатанному признаку и классу случая.

В этом случае Paypal is-a тип PaymentInstrument, или вы можете сформулировать это как PaymentInstrument это Paypal or Ideal.

Тогда Paypal - это тип продукта, где Paypal has-a accountId and amount.

Как вы заметили, если это класс case, кроме String, существует бесконечное количество возможностей. Если у класса есть Int, вам нужно учитывать 256, а если он принимает логическое значение, вам нужно учитывать 2 возможности. Следовательно, чем меньше возможностей вам придется иметь дело, тем больше кода вам придется написать. Один сценарий, о котором следует подумать при разработке типов данных.

3 основных вывода

  • Алгебраические типы данных - это не способ разработки кода функционального программирования, а способ категорий вашей модели данных.
  • Есть 3 случая алгебраических типов данных (сумма, произведение и гибрид).
  • Поняв ADT, вы также поймете, что большее количество параметров и комбинаций, которые вы создаете в своих типах данных, равняется большему количеству случаев, которые вам необходимо охватить. Если вам нужно охватить больше случаев в вашем коде, модульный тест будет намного сложнее.

Первоначально опубликовано на https://edward-huang.com.