Dans une réponse précédente du site d'informatique théorique , j'ai dit que la théorie des catégories est le "fondement" de la théorie des types. Ici, je voudrais dire quelque chose de plus fort. La théorie des catégories est la théorie des types . À l'inverse, la théorie des types est la théorie des catégories . Laissez-moi développer sur ces points.
La théorie des catégories est la théorie des types
En tout langage formel typé, et même en mathématiques normales en utilisant la notation informelle, on finit par déclarer les fonctions avec les types . En écriture, c'est l'idée et sont appelées "types" et que est une "fonction" d'un type à l'autre. La théorie des catégories est la théorie algébrique de tels "types" et "fonctions". (Officiellement, la théorie des catégories les appelle "objets" et "morphismes" afin d'éviter de taper sur la théorie des ensembles des traditionalistes, mais de plus en plus, je vois de plus en plus des théoriciens des catégories lâcher une telle prudence et utiliser les termes plus intuitifs: "type "et" fonction ". Mais,A B ff:A→BABf
Nous avons tous appris la théorie des ensembles à partir du lycée. Nous sommes donc habitués à considérer les types tels que et comme des ensembles et les fonctions telles que comme des mappages théoriques des ensembles. Si vous n'y avez jamais pensé de cette façon, vous êtes en forme. Vous avez échappé au lavage de cerveau selon la théorie des ensembles. La théorie des catégories dit qu'il existe de nombreux types et types de fonctions. Ainsi, l’idée des types en tant qu’ensembles est limitante. Au lieu de cela, la théorie des catégories axiomatise les types et les fonctions de manière algébrique. Fondamentalement, c'est ce que la théorie des catégories est. Une théorie des types et des fonctions. Il devient assez sophistiqué, impliquant des niveaux élevés d'abstraction. Mais si vous pouvez l'apprendre, vous acquerrez une compréhension profonde des types et des fonctions.b fABf
La théorie des types est la théorie des catégories
Par "théorie des types", j'entends tout type de langage formel dactylographié, basé sur des règles rigides de formation des termes qui garantissent que tout est vérifié. Il s'avère que chaque fois que nous travaillons dans un tel langage, nous travaillons dans une structure de catégorie théorique. Même si nous utilisons des notations de la théorie des ensembles et pensons de manière théorique, nous finissons toujours par écrire des choses qui ont un sens catégorique. C'est un fait étonnant .
Historiquement, Dana Scott a peut-être été le premier à le réaliser. Il a travaillé à la production de modèles sémantiques de langages de programmation basés sur le calcul lambda typé (et non typé). Les modèles traditionnels de la théorie des ensembles étaient inadéquats à cette fin, car les langages de programmation impliquent une récursion sans restriction, ce qui rend la théorie des ensembles absente. Scott a inventé une série de modèles sémantiques qui capturent les phénomènes de programmation et a compris que le lambda calcul typé représentait exactement une classe de catégories appelées catégories fermées cartésiennes . Il y a beaucoup de catégories fermées cartésiennes qui ne sont pas de la "théorie des ensembles". Mais le lambda calcul typé s’applique également à tous. Scott a écrit un bel essai intitulé " Relier les théories du calcul lambda"expliquant ce qui se passe, dont certaines parties semblent être disponibles sur le Web. L'article original a été publié dans un volume intitulé" To HB Curry: Essais sur la logique combinatoire, le calcul lambda et le formalisme ", Academic Press, 1980. Berry and Curien en est venu à la même réalisation, probablement indépendamment: ils ont défini une machine abstraite catégorique (CAM) pour utiliser ces idées dans la mise en œuvre de langages fonctionnels, et le langage qu'ils ont implémenté s'appelait "CAML", qui est la structure sous-jacente du F # de Microsoft .
Les constructeurs de type standard tels que , , etc. sont des foncteurs . Cela signifie qu’ils mappent non seulement les types sur les types, mais également entre les types et les fonctions entre les types. Les fonctions polymorphes préservent toutes les fonctions résultant des actions du foncteur. La théorie des catégories a été inventée dans les années 1950 par Eilenberg et MacLane→ L i s t×→Listprécisément pour formaliser le concept de fonctions polymorphes. Ils les ont appelées "transformations naturelles", "naturelles" car ce sont les seules que vous pouvez écrire de manière correcte en utilisant des variables de type. On pourrait donc dire que la théorie des catégories a été inventée précisément pour formaliser les langages de programmation polymorphes, avant même que les langages de programmation ne soient apparus!
Un traditionaliste de la théorie des ensembles n'a aucune connaissance des foncteurs et des transformations naturelles qui se déroulent sous la surface lorsqu'il utilise des notations de la théorie des ensembles. Mais, tant qu’il utilise le système de typage fidèlement, il fait réellement des constructions catégoriques sans s’en rendre compte.
Tout compte fait, la théorie des catégories est la théorie mathématique par excellence des types et des fonctions. Ainsi, tous les programmeurs peuvent tirer des enseignements de la théorie des catégories, en particulier les programmeurs fonctionnels. Malheureusement, il ne semble pas y avoir de manuels sur la théorie des catégories destinés aux programmeurs en particulier. Les livres "Théorie des catégories pour l'informatique" s'adressent généralement aux étudiants / chercheurs en informatique théorique. Le livre de Benjamin Pierce, La théorie des catégories de base pour les informaticiens est peut-être le plus lisible.
Cependant, il existe de nombreuses ressources sur le Web destinées aux programmeurs. La page Haskellwiki peut être un bon point de départ. À la Midlands Graduate School , nous organisons des conférences sur la théorie des catégories (entre autres). Le cours de Graham Hutton était considéré comme un cours "débutant" et le mien comme un cours "avancé". Mais les deux couvrent essentiellement le même contenu, allant à des profondeurs différentes. L'Université de Chalmers a une belle page de ressources sur les livres et les notes de cours du monde entier. Le site de blog enthousiaste de "sigfpe" fournit également beaucoup de bonnes intuitions du point de vue du programmeur.
Les sujets de base que vous voudriez apprendre sont:
- définition des catégories et quelques exemples de catégories
- foncteurs, et des exemples d'entre eux
- transformations naturelles et exemples
- définitions de produits, coproduits et exposants (espaces fonctions), objets initiaux et terminaux.
- adjonctions
- monades, algèbres et catégories de Kleisli
Mes propres notes de cours à la Midlands Graduate School couvrent tous ces sujets, à l’exception du dernier (monades). De nombreuses autres ressources sont disponibles pour les monades de nos jours. Donc, ce n'est pas une grosse perte.
Plus vous connaissez les mathématiques, plus il serait facile d'apprendre la théorie des catégories. La théorie des catégories étant une théorie générale des structures mathématiques, il est utile de connaître quelques exemples pour comprendre le sens des définitions. (Quand j'ai appris la théorie des catégories, j'ai dû créer mes propres exemples en utilisant mes connaissances en sémantique des langages de programmation, car les manuels classiques ne contenaient que des exemples mathématiques, ce que je ne connaissais pas du tout.) Puis vint le brillant livre de Lambek et Scott a appelé " Introduction à la logique catégorique"qui reliaient la théorie des catégories aux systèmes de typage (ce qu'ils appellent" logique "). Il est maintenant possible de comprendre la théorie des catégories simplement en la reliant à des systèmes de typage, même sans connaître beaucoup d'exemples. Beaucoup des ressources que j'ai mentionnées ci-dessus approche pour expliquer la théorie des catégories.