Niestety „biegunowość” jest nieco przeciążoną koncepcją teorii typów. „Pozycja dodatnia” i „pozycja ujemna” odnoszą się do innego pojęcia polaryzacji niż to, o czym mówi Bob z ogniskowaniem / polaryzacją.
Twoje znaczenie
Podczas definiowania typu indukcyjnego podajesz szereg reguł odpowiadających operacjom dla zdefiniowanego typu. Na przykład możesz powiedzieć, że a Nat
jest czymś
- wartość
zero : Nat
- funkcja
suc : Nat -> Nat
A potem oczekuj, że Nat
zawiera wszystkie wartości, które można wygenerować po wielokrotnym zastosowaniu suc
do innych Nat
s i obejmuje zero
. Zgodnie z tą konstrukcją indukcyjną otrzymujemy zasadę rekurencji między Nat
s, która działa w oparciu o fakt, że dowolna Nat
jest generowana przez tych konstruktorów.
rec : A -> (A -> A) -> Nat -> A
po to aby
rec Z S zero = zero
rec Z S (suc n) = S (rec Z S n)
Istnieją jednak pewne ograniczenia dotyczące tego, co możemy napisać jako reguły. W przeciwnym razie możemy zapisać szereg zasad, dla których nie można uzasadnić zasady rekurencji. Rozważ „typ indukcyjny” D
z jednym konstruktorem
Tutaj nie ma rozsądnej zasady rekurencji. i nie bez powodu! Gdybyśmy mieli jakąś zasadę rekurencji, moglibyśmy użyć jej do zakodowania wersji aplikacji własnej, a wraz z nią nieterminacji. Oznacza to, D
że nie można go nazwać „indukcyjnym”, ponieważ typy indukcyjne są konstrukcjami skończonymi generowanymi przez wielokrotne stosowanie konstruktorów!
Aby sobie z tym poradzić, ograniczamy możliwość rekurencji typów indukcyjnych w teorii typów. W szczególności zapobiegamy ich pojawianiu się w „negatywnych miejscach”. Jest to pojęcie polaryzacji, o którym mówiłeś. Tak więc biegunowość pozycji jest ustalana,
- Argument zaczyna się od pozytywnej pozycji
- Za każdym razem, gdy idziemy w lewo, strzałka zmienia biegunowość
Więc X
jest dodatni w pierwszych dwóch i ujemny w dwóch drugich
X
Int -> X
X -> Int
(Unit -> X) -> Int
Ta idea jest uzasadniona odwoływaniem się do teorii kategorii, w której typ indukcyjny, którego jedyne nawroty są dodatnie, powoduje funktor kowariantny. Szczegóły tego, jak to działa i dlaczego jest to interesujące, trochę długie.
Znaczenie Boba Harpera
Na swoim blogu Harper mówił o innym znaczeniu polaryzacji. Ta biegunowość odnosi się do tego, jak różne łączniki w logice mają znaczenie. W szczególności możemy klasyfikować łączniki na dwa sposoby
- Pozytywne łączniki można zdefiniować, definiując sposób ich wprowadzenia (ich zasady wprowadzania)
- Negatywne łączniki można zdefiniować, definiując sposób ich użycia (zasady ich eliminacji)
W języku programowania ładnie oddaje to rozróżnienie między typami leniwymi i surowymi. Typ ścisły jest definiowany przez jego wartości. Leniwy jest zdefiniowany przez to, jak można dopasować wzór na nich. Aby poradzić sobie z tym poprawnie, definiujemy język z 2 głównymi konstrukcjami, sposobami budowania typów pozytywnych i „kolcami” do rozkładania typów negatywnych. Możemy to wykorzystać do włączenia zarówno ścisłego, jak i leniwego obliczenia do jednego języka.
Aby to lepiej zrozumieć, odsyłam do rozdziału 38 Boba Harpera książki .