Что такое структуры данных "суммы и продукты"? - PullRequest
42 голосов
/ 06 мая 2011

A недавнее сообщение в блоге о слияниях Уильяма Кука упоминает:

Ключевым моментом является то, что структуры в Ensō рассматриваются в целом как графики, а не как отдельные значения или традиционные структуры данных сумм и продуктов.

На какие традиционные структуры данных сумм и продуктов он ссылается?

Ответы [ 4 ]

88 голосов
/ 06 мая 2011

На какие традиционные структуры данных сумм и продуктов он ссылается?

В теории типов регулярные структуры данных могут быть описаны в терминах сумм, продуктов и рекурсивных типов.,Это приводит к алгебре для описания структур данных (и так называемым алгебраическим типам данных ).Такие типы данных распространены в статически типизированных функциональных языках, таких как ML или Haskell.

Продукты

Продукты можно рассматривать как теоретико-типовое представление "структур""или" кортежи ".

Формально, PFPL, Ch 14:

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

Суммы

Типы сумм выражают выбор между вариантами структуры данных.Иногда их называют «объединение типов» (как в C).Многие языки не имеют представления о типах сумм.

PFPL, ch 15:

Большинство структур данных включают альтернативы, такие как различие между листом и внутренним узлом в дереве, иливыбор во внешней форме части абстрактного синтаксиса.Важно отметить, что выбор определяет структуру стоимости.Например, у узлов есть дети, а у листьев нет, и так далее.Эти понятия выражаются типами сумм, в частности двоичной суммой, которая предлагает выбор из двух вещей, и нулевой суммой, которая предлагает выбор без вещей.

Рекурсивные типы

Наряду с продуктами и суммами мы можем ввести рекурсию, поэтому тип может быть определен (частично) в терминах самого себя.Хорошие примеры включают деревья и списки.

 data List a = Empty | a : List a

 data Tree a = Nil | Node a (Tree a) (Tree a)

Алгебра сумм, продуктов и рекурсии

Дайте тип, скажем Int, мы можем начать создаватьзапись для алгебраических выражений, которые описывают структуры данных:

Одиночная переменная:

Int

Произведение двух типов (обозначающее пару):

Int * Bool

Сумма двух типов (что означает выбор между двумя типами):

Int + Bool

И некоторые константы:

1 + Int

где 1 - тип устройства, ().

Как только вы сможете описать типы таким образом, вы получите немного крутой энергии бесплатно.Во-первых, очень краткое обозначение для описания типов данных, во-вторых, некоторые результаты переносятся из других алгебр (например, дифференцирование работает со структурами данных ).

Примеры

Тип устройства, data () = ()

enter image description here

Кортеж, самый простой тип продукта : data (a,b) = (a,b)

enter image description here

Простой тип суммы , data Maybe a = Nothing | Just a

enter image description here

и его альтернатива,

enter image description here

и рекурсивный тип , тип связанных списков: data [a] = [] | a : [a]

enter image description here

Учитывая это, вы можете создавать довольно сложные структуры с помощьюобъединение сумм, продуктов и рекурсивных типов.Например, простая запись для списка продуктов сумм продуктов: [(Maybe ([Char], Double), Integer)] дает начало довольно сложным деревьям:

enter image description here


Список литературы

35 голосов
/ 25 июня 2013

Очень подробные ответы уже были даны, но почему-то в них не упоминается этот простой факт.

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

Это вытекает из теории типов, определяющей тип как набор значений.

data MySumType = Foo Bool | Bar Char
data MyProductType = Baz (Bool, Char)
  • Bool - это набориз 2 значений.
  • Char - это набор из 256 значений.
  • MySumType - это набор из 2 + 256 значений.
  • MyProductType - это набор из 2 * 256 значений.

Теперь вы никогда не забудете, что есть что.

5 голосов
/ 06 мая 2011

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

Примеры:

  • Если a относится к типу A, а b относится к типу B, тогда (a, b) относится к типу A x B, который является типом продукта .

  • Тип списка со значениями вида Nil или Cons x xs является типом суммы .

Ensō, очевидно, имеет больший акцент на графах, чем эти древовидные алгебраические типы.

1 голос
/ 23 ноября 2016

Из примечаний к лекциям курса Coursera "Языки программирования", предлагаемых Univ.of Washington:

«Почему произведение и сумма? Это связано с тем, что в булевой алгебре, где 0 ложно, а 1 истинно, работает как умножение и или работает как сложение».

...