На жаль, "полярність" є дещо перевантаженою концепцією в теорії типів. "Позитивна позиція" і "негативна позиція" відносяться до іншого поняття полярності, ніж те, про що говорить Боб з фокусуванням / поляризацією.
Ваше значення
Коли ви визначаєте індуктивний тип, ви даєте ряд правил, які відповідають операціям для типу, який ви визначаєте. Наприклад, ви можете сказати, що Natце щось із
- значення
zero : Nat
- функція
suc : Nat -> Nat
І тоді очікуйте, що він Natмістить усі значення, які можна створити при багаторазовому застосуванні sucдо інших Nats і включає zero. Відповідно до цієї індуктивної побудови ми отримуємо принцип рекурсії через Nats, який працює на основі того, що будь- Natякий генерується цими конструкторами.
rec : A -> (A -> A) -> Nat -> A
так що
rec Z S zero = zero
rec Z S (suc n) = S (rec Z S n)
Однак є деякі обмеження щодо того, що ми можемо записати як правила. В іншому випадку ми можемо записати ряд правил, для яких принцип рекурсії не може бути виправданим. Розглянемо "індуктивний тип" Dз одним конструктором
Тут немає принципу нормальної рекурсії. і не дарма! Якби у нас був якийсь принцип рекурсії, ми могли б використовувати його для кодування версії самозастосування та з нею нетермінації. Це означає, що Dне можна назвати "індуктивним", оскільки індуктивні типи - це кінцеві конструкції, що генеруються при багаторазовому застосуванні конструкторів!
Для вирішення цього питання ми обмежимо, наскільки індуктивні типи можуть бути рекурсивними в теорії типів. Зокрема, ми зупиняємо їх появу в "негативних місцях". Це те поняття полярності, про яке ви говорили. Полярність положення визначається таким чином,
- Аргумент починається з позитивної позиції
- Щоразу, коли ми йдемо стрілку ліворуч, полярність розгортається
Так Xє позитивним у перших двох, а негативний - у другому
X
Int -> X
X -> Int
(Unit -> X) -> Int
Ця ідея виправдана шляхом використання теорії категорій, коли індуктивний тип, у якого позитивні лише повторення, породжує коваріантний функтор. Подробиці того, як це працює, і чому його цікаво, трохи довго.
Значення Боба Харпера
У своєму дописі на блогах Гарпер говорив про інше значення полярності. Ця полярність посилається на те, як різні сполучники в логіці надають значення. Зокрема, ми можемо класифікувати сполучники двома способами
- Позитивні сполучники можна визначити, визначивши спосіб їх введення (правила їх введення)
- Негативні сполучники можна визначити, визначивши спосіб їх використання (правила їх усунення)
У мові програмування це чудово фіксує відмінність між ледачим та суворим типами. Суворий тип визначається його значеннями. Ледачий визначається тим, як можна узгоджувати візерунок на них. Для того, щоб правильно впоратися з цим, ми визначимо мову з двома основними конструкціями, способами побудови позитивних типів та "колючками" для розкладання негативних типів. Ми можемо використати це для того, щоб включити як суворі та ліниві обчислення в одну мову.
Для того , щоб зрозуміти це краще, я відсилаю вас до глави 38 Боба Харпера книги .