Haskell accepte la définition du type suivant
data Lam = Func (Lam -> Lam)
qui entend représenter Termes lambda non typés . Par exemple, les booléens de Church sont de ce type
trueChurch :: Lam
trueChurch = Func (\x -> Func (\y -> x))
falseChurch :: Lam
falseChurch = Func (\x -> Func (\y -> y))
Le constructeur Func :: (Lam -> Lam) -> Lam
a cette fonction inverse
lamUnfold :: Lam -> (Lam -> Lam)
lamUnfold (Func f) = f
et ces deux fonctions définissent un isomorphisme de type entre Lam -> Lam
y Lam
. Ceci est surprenant lorsque l'on regarde les cardinaux (les tailles) de ces types. À cause des booléens de Church ci-dessus, le cardinal de Lam
est d'au moins 2, donc il y a plus d'éléments dans Lam -> Lam
que dans Lam -> Bool
. Ce dernier est le type de sous-types de Lam
c'est-à-dire l'ensemble des puissances de Lam
et par Le théorème de Cantor il a déjà beaucoup plus d'éléments que Lam
fait. Comment l'existence du type Lam
ne viole pas le théorème de Cantor ?
Une partie de la réponse pourrait se trouver dans théorie des domaines . Si je comprends bien, les éléments de Lam -> Lam
ne serait pas l'ensemble des fonctions de la théorie des ensembles (qui sont plus grandes que Lam
par le théorème de Cantor), mais seulement des fonctions continues. Si c'est le cas, quelle est la topologie qui définit cette continuité, et pourquoi les termes Haskell de type Lam -> Lam
continue pour elle ?