Malheureusement, la "polarité" est un concept quelque peu surchargé dans la théorie des types. "Position positive" et "position négative" se réfèrent à une notion de polarité différente de celle dont parle Bob avec la focalisation / polarisation.
Votre sens
Lorsque vous définissez un type inductif, vous donnez une série de règles qui correspondent aux opérations pour le type que vous définissez. Par exemple , vous pourriez dire un Nat
est quelque chose avec
- une valeur
zero : Nat
- une fonction
suc : Nat -> Nat
Et puis attendez-vous à ce qu'il Nat
contienne toutes les valeurs qui peuvent être générées à partir de l'application répétée suc
à d'autres Nat
s et inclut zero
. Conformément à cette construction inductive, nous obtenons un principe de récursivité à travers Nat
s qui fonctionne basé sur le fait que tout Nat
est généré par ces constructeurs.
rec : A -> (A -> A) -> Nat -> A
pour que
rec Z S zero = zero
rec Z S (suc n) = S (rec Z S n)
Cependant, il existe certaines restrictions sur ce que nous pouvons écrire en tant que règles. Sinon, nous pouvons écrire une série de règles pour lesquelles le principe de récursivité ne peut être justifié. Considérez le "type inductif" D
avec un constructeur
Ici, il n'y a pas de principe de récursivité sain ici. et pour une bonne raison! Si nous avions un principe de récursivité, nous pourrions l'utiliser pour encoder une version de l'auto-application et avec elle, la non-terminaison. Cela D
ne peut pas être appelé "inductif" car les types inductifs sont des constructions finies générées à partir de constructeurs appliquant à plusieurs reprises!
Pour y faire face, nous restreignons la façon dont les types inductifs peuvent être récursifs dans la théorie des types. Plus précisément, nous les empêchons d'apparaître dans des "endroits négatifs". C'est cette notion de polarité dont vous parliez. La polarité d'une position est ainsi déterminée,
- L'argument commence dans une position positive
- Chaque fois que nous allons à gauche une flèche, la polarité bascule
X
Est donc positif dans les deux premiers et négatif dans les deux autres
X
Int -> X
X -> Int
(Unit -> X) -> Int
Cette idée se justifie par un recours à la théorie des catégories où un type inductif dont les seules récurrences sont positives donne naissance à un foncteur covariant. Les détails de comment cela fonctionne et pourquoi c'est intéressant un peu long.
Signification de Bob Harper
Dans son blog, Harper parlait d'une signification différente de la polarité. Cette polarité fait référence à la façon dont divers connecteurs en logique ont un sens. En particulier, nous pouvons classer les connecteurs de deux manières
- Les connecteurs positifs peuvent être définis en définissant comment les introduire (leurs règles d'introduction)
- Les connecteurs négatifs peuvent être définis en définissant comment les utiliser (leurs règles d'élimination)
En termes de langage de programmation, cela capture bien la distinction entre les types paresseux et stricts. Un type strict est défini par ses valeurs. Un paresseux est défini par la façon dont le motif peut correspondre sur eux. Afin de gérer cela correctement, nous définissons un langage avec 2 constructions principales, des façons de construire des types positifs et des "épines" pour décomposer les types négatifs. Nous pouvons l'utiliser pour incorporer à la fois le calcul strict et le calcul paresseux dans une seule langue.
Afin de mieux comprendre cela, je vous renvoie au chapitre 38 du livre de Bob Harper .