J'étudie les systèmes de types purs, en particulier le calcul des constructions, et j'essaie d'utiliser un codage pour les types récursifs, ce qui, selon Philip Wadler, est possible . À titre d'exemple, j'utilise la bibliothèque Morte Haskell pour coder les chiffres Scott comme donnés par Cardelli .
Un résumé de l'encodage est en tant que tel: étant donné un type récursif (positif) ...
... nous pouvons le coder comme un type sur le système F comme ...
... ou, en utilisant la notation des systèmes de type pur (avec une explicite ) ...
...depuis est un constructeur de type ( est le type de types).
Afin de coder de tels codes, nous devons déclarer trois fonctions, , et , selon Wadler, et utilisé par Cardelli pour l'encodage des chiffres Scott.
plier: Tous X. (FX -> X) -> T -> X
fold = \ X. \ k: FX -> X. \ t: T. t X k
dans: FT -> T
dans = \ s: F T. \ X. \ k: FX -> X. k (F (pli X k) s).
(Où est .)
Il est trivial d'écrire le fonctionner comme indiqué. Mais en essayant d'écrire lefonction, il ne semble pas typecheck. L'expression a un type , et devrait être de type . Ensuite, nous déduisons que devrait être de type (ressemble à un fmap
). Cela ne vérifie pas le type, car il F
s'agit d'un constructeur de type (de type).
Cela ne ressemble pas à une faute de frappe ... manque-t-il quelque chose?
la source
fmap
! Je n'ai aucune expérience de la théorie des catégories, mais j'ai trouvé cela il y a environ 10 minutes sur "Une note sur les types de données catégoriques" (GC Wralth). J'étais maintenant capable d'écrire la fonction correcte, fonctionnait comme un charme. Merci beaucoup, dr. Wadler! : D