Це дещо незрозуміло, але обчислення з'являється в алгебраїчних типах даних. Для будь-якого типу тип похідних цього типу є одним з його отворів. Дивіться цю чудову розмову для огляду всієї теми. Це дуже технічна термінологія, тому давайте пояснимо.
Алгебраїчні типи даних
Можливо, ви натрапили на кортежі, які називаються видами продукції (якщо ні, це тому, що вони є декартовим продуктом двох типів). Ми будемо розуміти це буквально і використовувати позначення:
a∗b
Представити кортеж, де і обидва типи. Далі, можливо, ви натрапили на типи сум ( це типи, які можуть бути або одним типом, або іншим (відомі як об'єднання , варіанти , або як тип або в Хаскелі). Ми також будемо розуміти це буквально і використовувати позначення:ab
a+b
Вони називаються такими, як вони є, тому що якщо тип має значення а тип має значення , то тип має значення .aNabNba+bNa+Nb
Ці типи виглядають як звичайні алгебраїчні вирази, і ми, власне, можемо ними маніпулювати (до певної міри).
Приклад
У функціональних мовах загальним визначенням списку (наведене тут у Haskell) є таке:
data List a = Empty
| Cons a List
Це говорить про те, що список є порожнім або кордоном значення та іншим списком. Перетворюючи це в алгебраїчне позначення, ми отримуємо:
L(a)=1+a∗L(a)
Де являє собою тип з одним значенням (він же тип одиниці). Багаторазово вставляючи, ми можемо оцінити це, щоб отримати визначення для :1L(a)
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+a3∗(1+a∗L(a))
L(a)=1+a+a2+a3+a4+a5...
(Де мається на увазі у значенні повторного множення.)xn
Це визначення тоді говорить, що список є або одиницею, або кордоном одного елемента, або кортежем з двох предметів, або з трьох тощо, що є визначенням списку!
Контексти з одним отвором
Тепер до контексту з одним отвором: контекст з одним отвором - це те, що ви отримуєте, коли ви «виймаєте значення» з типу продукту. Наведемо приклад:
Для простого 2-кортежа, який є однорідним, , якщо ми виймаємо значення, ми просто отримуємо 1-кортеж, . Але є два різних контексти одного отвору цього типу: а саме перше і друге значення кортежу. Отже, оскільки це будь-яке з них, ми могли б написати, що це , що, звичайно, . Ось тут і грає диференціація. Підтвердимо це ще одним прикладом:a2aa+a2a
Виведення значення з 3-х кортезів дає 2-кортежні, але є три різні варіанти:
(a,a,_)
(a,_,a)
(_,a,a)
Залежно від того, куди ми поставимо отвір. Це дає нам що справді є похідною . Існує доказ цього взагалі тут .3a2a3
Для нашого останнього прикладу скористаємось списком:
Якщо взяти наш оригінальний вираз для списку:
L(a)=1+a∗L(a)
Ми можемо переставити, щоб отримати:
L(a)=11−a
(На поверхні це може здатися нісенітницею, але якщо взяти цей телорізовий ряд, ви отримаєте визначення, яке ми отримали раніше.)
Тепер, якщо ми розмежуємо це, ми отримаємо цікавий результат:
∂L(a)∂a=(L(a))2
Таким чином, один список став парою списків. Це насправді має сенс: два складені списки відповідають елементам над і під діркою в оригінальному списку!