Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВВЕДЕНИЕ.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
898.6 Кб
Скачать

Определение атд

Алгебраический тип данных неформально можно определить как множество значений, представляющих собой некоторые контейнеры, внутри которых могут находиться значения каких-либо иных типов (в том числе и значения того же самого типа — в этом случае имеет место рекурсивный АТД). Множество таких контейнеров и составляет сам тип данных, множество его значений.

Алгебраический тип данных — размеченное объединение декартовых произведений множеств или, другими словами, размеченная сумма прямых произведений множеств.

С теоретической точки зрения алгебраическим типом данных является размеченное объединение множеств (иначе называемое «дизъюнктным объединением»)7, под которым понимается видоизменённая классическая операция объединения — такая операция приписывает каждому элементу нового множества метку (или индекс), по которой можно понять, из какого конкретно множества элемент попал в объединение. Соответственно, каждый из элементов размеченного объединения в свою очередь является декартовым произведением некоторых иных множеств.

Пусть есть набор множеств Ai, iI, из которых создаётся их размеченное объединение. В этом случае под размеченным объединением понимается объединение пар:

 

i ∈ I

 Ai = 

 

i ∈ I

 { (xi) ∣ x ∈ Ai }.

Здесь (x, i) — упорядоченная пара, в которой элементу x приписан индекс множества, из которого элемент попал в размеченное объединение. В свою очередь каждое из множеств Ai канонически вложено в размеченное объединение, то есть пересечения канонических вложений Ai* всегда пусты, даже в случаях, когда пересечения исходных множеств содержат какие-либо элементы. Другими словами, каноническое вложение имеет вид:

Ai* = { (xi) ∣ x ∈ Ai },

а потому

∀ ij ∈ Ii ≠ j : Ai* ⋂ Aj* = ∅.

Итак, АТД — это размеченное объединение, то есть элементы такого типа с математической точки зрения представляют собой пары (x, i), где i — индекс множества (метка типа), откуда взят элемент x. Но чем являются сами элементы x? Теория говорит о том, что эти элементы являются декартовыми произведениями множеств, которые содержатся внутри контейнеров Ai. То есть, каждое множество Ai, из которых собирается размеченное объединение, является декартовым произведением некоторого (возможно, нулевого) числа множеств. Именно эти множества и считаются «вложенными» в контейнер АТД, вложение обеспечивает операция декартова произведения.

Другими словами, каждое множество Ai представляет собой декартово произведение:

Ai = Ai1 × Ai2 × … × Ain,

где множества Aik, k = 1, n являются произвольными (в том числе нет ограничений на рекурсивную вложенность). Поскольку элементами декартова произведения множеств являются кортежи вида

x = (x1x2, … xn),

в целом АТД можно записать как

 

i ∈ I

 Ai = 

 

i ∈ I

 { ((x1x2, … xni), i) }.     (1)

В общем случае декартово произведение вообще может быть представлено пустым кортежем. Тогда считается, что соответствующий контейнер Ai не содержит никаких значений внутри себя, а в размеченное объединение канонически вкладывается единственный элемент этого множества — ((), i). Данная ситуация возможна тогда, когда в АТД включается метка i ради самой себя, то есть в АТД содержится нуль-арное каноническое множество Ai*, имеющее единственный элемент. Обычно это требуется для определения перечислений (эта ситуация и её реализация будут продемонстрированы далее в статье).

Для лучшего понимания того, что представляет собой АТД, можно представить общую формулу произвольного АТД в виде диаграммы. Сообразуясь с формулой 1, произвольный АТД можно изобразить так, как показано на рис. 1.

Рис. 1: Схема произвольного АТД

В качестве примера АТД в математической нотации можно рассмотреть тип Tree, введённый ранее:

data Tree α = Leaf α

| Node (Tree α) (Tree α)

Данный тип есть размеченное объединение двух множеств Leaf и Node, так что A1Leaf, A2Node. Множество A1 есть декартово произведение одного произвольного множества a. Значения этого множества «упаковываются» в контейнер A1. Соответственно, множество A2 есть декартово произведение двух одинаковых множеств Tree(a), то есть налицо рекурсивное определение АТД.