"Алгебраическое" выражение для алгебраических типов данных выглядит очень наводящим на размышления кого-то, у кого есть опыт в математике. Позвольте мне попытаться объяснить, что я имею в виду.
Определив основные типы
- Продукт
•
- Союз
+
- Синглтон
X
- Единица
1
и используя сокращенную X²
для X•X
и 2X
для X+X
et cetera, мы можем тогда определить алгебраические выражения, например. связанные списки
data List a = Nil | Cons a (List a)
↔ L = 1 + X • L
и двоичные деревья:
data Tree a = Nil | Branch a (Tree a) (Tree a)
↔ T = 1 + X • T²
Теперь, мой первый инстинкт как математик должен сходить с этими выражениями и попытаться решить для L
и T
. Я мог бы сделать это через повторную замену, но, похоже, гораздо легче злоупотреблять обозначением ужасно и притворяться, что я могу изменить его по своему усмотрению. Например, для связанного списка:
L = 1 + X • L
(1 - X) • L = 1
L = 1 / (1 - X) = 1 + X + X² + X³ + ...
где я использовал расширение степенного ряда 1 / (1 - X)
совершенно необоснованным образом, чтобы получить интересный результат, а именно, что тип L
либо Nil
, либо он содержит 1 элемент, либо содержит 2 элементов или 3 и т.д.
Это становится более интересным, если мы делаем это для двоичных деревьев:
T = 1 + X • T²
X • T² - T + 1 = 0
T = (1 - √(1 - 4 • X)) / (2 • X)
T = 1 + X + 2 • X² + 5 • X³ + 14 • X⁴ + ...
снова, используя расширение степенного ряда (сделано с Wolfram Alpha). Это выражает неочевидный (для меня) факт, что существует только одно двоичное дерево с 1 элементом, 2 двоичных дерева с двумя элементами (второй элемент может быть слева или справа), 5 двоичных деревьев с тремя элементами и т.д..
Итак, мой вопрос: что я здесь делаю? Эти операции кажутся необоснованными (что же такое квадратный корень алгебраического типа данных?), Но они приводят к разумным результатам. имеет ли значение два типа алгебраических данных какое-либо значение в информатике, или это просто нотационный обман?
И, возможно, более интересно, можно ли расширить эти идеи? Существует ли теория алгебры типов, которая позволяет, например, произвольные функции на типах, или типы требуют представления степенного ряда? Если вы можете определить класс функций, то имеет ли состав функций какой-либо смысл?