У меня есть история для исследования того, может ли Цирцея полиморфно анализировать объекты Json в ADT. Один из вопросов, который я получил, был: что такое ADT?
Я пробормотал пару минут, понимая, что не могу сказать конкретного объяснения того, что такое ADT.
После того, как меня вызвали перед стендом, я решил, что должен понять, что такое алгебраические типы данных - и я думаю, что эти знания необходимы и часто используются во многих приложениях функционального программирования.
Цитировать Элвин Александр -
Алгебраические типы данных не являются способом упреждающего проектирования кода FP (функционального программирования); вместо этого они позволяют категоризировать уже написанные вами модели данных, особенно модели данных FP.
Обычно мы знакомы с ADT во многих моделях данных FP, таких как тип Enumeration (Enum) в ООП. Однако ADT представляет собой более широкую категорию, чем просто Enums
.
Одно из преимуществ написания ADT:
- заключается в том, что вы можете выполнять стиль программирования с сопоставлением с образцом.
- Ваш код становится более «алгеброй»
Что означает «алгебра»?
Многие из нас знают алгебру, с которой сталкиваются в старшей школе. Пример:
Это числовая алгебра.
Однако, изучая больше ФП, вы поймете, что алгебра состоит из двух характеристик:
- Набор предметов
- Операции, примененные к этим объектам для создания новых объектов
В случае числовой алгебры, например, 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.