Sfortunatamente la "polarità" è un concetto alquanto sovraccarico nella teoria dei tipi. "Posizione positiva" e "posizione negativa" si riferiscono a una nozione diversa di polarità rispetto a ciò di cui Bob sta parlando con messa a fuoco / polarizzazione.
Il tuo significato
Quando definisci un tipo induttivo, dai una serie di regole che corrispondono alle operazioni per il tipo che stai definendo. Ad esempio, potresti dire che a Nat
è qualcosa con
- un valore
zero : Nat
- una funzione
suc : Nat -> Nat
E poi aspettati che Nat
contenga tutti i valori che possono essere generati dall'applicazione ripetuta suc
ad altri se Nat
include zero
. In linea con questa costruzione induttiva otteniamo un principio di ricorsione su Nat
s che funziona in base al fatto che qualcuno Nat
è generato da quei costruttori.
rec : A -> (A -> A) -> Nat -> A
così che
rec Z S zero = zero
rec Z S (suc n) = S (rec Z S n)
Tuttavia, ci sono alcune restrizioni su ciò che possiamo scrivere come regole. Altrimenti, possiamo scrivere una serie di regole per le quali il principio della ricorsione non può essere giustificato. Considera il "tipo induttivo" D
con un solo costruttore
Qui non c'è un principio di ricorsione sano qui. e per una buona ragione! Se avessimo qualche principio di ricorsione, potremmo usarlo per codificare una versione di auto-applicazione e con essa, non termine. Questo significa che D
non può essere chiamato "induttivo" perché i tipi induttivi sono costruzioni finite generate da costruttori che applicano ripetutamente!
Per far fronte a questo, limitiamo il modo in cui i tipi induttivi possono essere ricorsivi nella teoria dei tipi. In particolare, impediamo loro di apparire in "luoghi negativi". Questa è la nozione di polarità di cui stavi parlando. La polarità di una posizione è determinata in tal modo,
- L'argomento inizia in una posizione positiva
- Ogni volta che andiamo a sinistra una freccia, la polarità si ribalta
Quindi X
è positivo nei primi due e negativo nei secondi due
X
Int -> X
X -> Int
(Unit -> X) -> Int
Questa idea è giustificata da un ricorso alla teoria delle categorie in cui un tipo induttivo con le cui uniche recidive sono positive dà origine a un covariante. I dettagli di come funziona e perché è interessante un po 'lungo.
Il significato di Bob Harper
Nel suo post sul blog, Harper parlava di un diverso significato di polarità. Questa polarità fa riferimento a come i vari connettivi nella logica hanno un significato. In particolare, possiamo classificare i connettivi in due modi
- I connettivi positivi possono essere definiti definendo come introdurli (le loro regole di introduzione)
- I connettivi negativi possono essere definiti definendo come usarli (le loro regole di eliminazione)
In termini di linguaggio di programmazione, ciò cattura piacevolmente la distinzione tra tipi pigri e rigorosi. Un tipo rigoroso è definito dai suoi valori. Uno pigro è definito da come può corrispondere il modello su di essi. Per gestirlo correttamente, definiamo una lingua con 2 costrutti principali, modi per costruire tipi positivi e "spine" per decomporre i tipi negativi. Possiamo usarlo per incorporare il calcolo rigoroso e pigro in una lingua.
Per capirlo meglio, ti rimando al capitolo 38 del libro di Bob Harper .