Типы объединения
По словам Роберта Харпера, "Практические основы языков программирования", гл. 15:
Большинство структур данных включают альтернативы, такие какразличие между листом и внутренним узлом дерева или выбор во внешней форме фрагмента абстрактного синтаксиса.Важно отметить, что выбор определяет структуру стоимости.Например, у узлов есть дети, а у листьев нет, и так далее.Эти понятия выражаются типами суммы , в частности двоичной суммой, которая предлагает выбор из двух вещей, и нулевой суммой, которая предлагает выбор без вещей.
Booleans
Простейшим типом суммы является логическое значение,
data Bool = True
| False
. Логические значения имеют только два допустимых значения, T или F. Поэтому вместо представления их в виде чисел мы можемвместо этого используйте тип суммы для более точного кодирования того факта, что есть только два возможных значения.
Перечисления
Перечисления являются примерами более общих типов сумм: те, у которых много,но конечные, альтернативные значения.
Типы сумм и нулевые указатели
Лучший практический пример для типов сумм - это различие между действительными результатами и значениями ошибок, возвращаемыми функциями, с помощьюразличая регистр ошибки.
Например, нулевые указатели и символы конца файла являются хакерскими кодировками типа суммы:
data Maybe a = Nothing
| Just a
, где мы можем dОпределите допустимые и недействительные значения с помощью тега Nothing
или Just
, чтобы аннотировать каждое значение своим статусом.
Используя таким образом типы сумм, мы можем полностью исключить ошибки нулевого указателя, что является довольно приличным мотивирующим примером.Нулевые указатели полностью обусловлены неспособностью старых языков легко выражать типы сумм.
Типы пересечений
Типы пересечений намного новее, и их применения не так широко распространены.понят.Тем не менее, тезис Бенджамина Пирса («Программирование с типами пересечений и ограниченным полиморфизмом») дает хороший обзор:
Наиболее интригующим и потенциально полезным свойством типов пересечений является их способность выражать по существу неограниченную (хотяконечно, конечно) количество информации о компонентах программы.
Например, функция сложения (+)
может иметь тип Int -> Int -> Int ^ Real -> Real -> Real
, фиксируя общий факт, что сумма двух действительных чиселвсегда реальный и более специализированный факт, что сумма двух целых всегда является целым числом.Компилятор для языка с типами пересечений может даже предоставить две разные последовательности объектного кода для двух версий (+)
, одна с использованием инструкции сложения с плавающей точкой, а другая с сложением целых чисел.Для каждого экземпляра + в программе компилятор может решить, являются ли оба аргумента целыми числами, и сгенерировать более эффективную последовательность объектного кода в этом случае.
Этот тип финитного полиморфизма или когерентной перегрузки настолько выразителен, что ..... набор всех допустимых типов для программы составляет полную характеристику поведения программы
Они позволяют нам кодировать много информации в типе, объясняя через теорию типов, что означает множественное наследование, даваятипы для ввода классов,