Это несколько неясно, но исчисление оказывается в алгебраических типах данных. Для любого данного типа тип его контекстов с одним отверстием является производной этого типа. Смотрите этот отличный разговор для обзора всей темы. Это очень техническая терминология, поэтому давайте объясним.
Алгебраические типы данных
Возможно, вы встречали кортежи, называемые типами продуктов (если нет, то это потому, что они являются декартовым продуктом двух типов). Мы собираемся принять это буквально и использовать обозначение:
a ∗ b
aб
а + б
aNaбNба + бNa+ Nб .
Эти типы выглядят как нормальные алгебраические выражения, и мы можем фактически манипулировать ими как таковыми (до некоторой степени).
Пример
В функциональных языках общее определение списка (приведенное здесь на Haskell) таково:
data List a = Empty
| Cons a List
Это говорит о том, что список либо пустой, либо кортеж значения и другого списка. Преобразуя это в алгебраическую запись, мы получаем:
L ( a ) = 1 + a ∗ L ( a )
1L ( а )
L ( a ) = 1 + a ∗ L ( a )
L ( a ) = 1 + a ∗ ( 1 + a ∗ L ( a ) )
L ( a ) = 1 + a + a2∗ ( 1 + a ∗ L ( a ) )
L(a)=1+a+a2+ а3∗ ( 1 + a ∗ L ( a ) )
L ( a ) = 1 + a + a2+ а3+ а4+ а5, , ,
ИксN
Это определение говорит тогда, что список - это либо единица, либо кортеж из одного элемента, либо кортеж из двух элементов, или из трех и т. Д., Что является определением списка!
Контексты с одним отверстием
Теперь перейдем к контексту с одним отверстием: контекст с одним отверстием - это то, что вы получаете, когда «извлекаете значение» из типа продукта. Давайте приведем пример:
a2aа + а2 а
Взятие значения из 3-х кортежей дает 2-кортеж, но есть три разных варианта:
( а , а , _ )
( а , _ , а )
( _ , a , a )
3 а2a3
Для нашего последнего примера, давайте использовать список:
Если мы возьмем наше оригинальное выражение для списка:
L ( a ) = 1 + a ∗ L ( a )
Мы можем переставить, чтобы получить:
L ( a ) = 11 - а
(На первый взгляд это может показаться бессмысленным, но если вы возьмете ряд Тейлора этого результата, вы получите определение, которое мы получили ранее.)
Теперь, если мы дифференцируем это, мы получим интересный результат:
∂L ( а )∂a= ( L ( a ) )2
Таким образом, один список стал парой списков. Это на самом деле имеет смысл: два создаваемых списка соответствуют элементам выше и ниже дыры в первоначальном списке!