Simon a fondamentalement raison, d'un point de vue extensionnel. Nous savons assez bien ce qu'est la sémantique des langages fonctionnels modernes, et ce sont vraiment des variations relativement petites les unes des autres - elles représentent chacune des traductions légèrement différentes dans un métalangage monadique. Même un langage comme Scheme (un langage impératif d'ordre supérieur typé dynamiquement avec un contrôle de première classe) a une sémantique qui est assez proche de ML et de Haskell.
V
Mais pour arriver à une catégorie adaptée à l'interprétation des langages fonctionnels typés modernes, les choses deviennent assez effrayantes. Fondamentalement, vous finissez par construire une catégorie enrichie en ultramétriques de relations d'équivalence partielle sur ce domaine. (Par exemple, voir Birkedal, Stovring et Thamsborg "Realizability Semantics of Parametric Polymorphism, General References, and Recursive Types".) Les personnes qui préfèrent la sémantique opérationnelle connaissent ce genre de choses comme des relations logiques indexées par étapes. (Par exemple, voir «L'indépendance de la représentation dépendante de l'État» d'Ahmed, Dreyer et Rossberg.) Quoi qu'il en soit, les techniques utilisées sont relativement nouvelles.
a -> b
⟨ Un ⟩ → T⟨ B ⟩⟨ Un ⟩ → ⟨ b ⟩T( A )⟨ Un ⟩a
→
En ce qui concerne la théorie équationnelle, puisque ces langues peuvent toutes deux être décrites par des traductions en sous-ensembles légèrement différents de la même langue, il est tout à fait juste de les appeler des variations syntaxiques les unes des autres.
La différence de sensation entre ML et Haskell provient en fait des propriétés intensionnelles des deux langages - c'est-à-dire du temps d'exécution et de la consommation de mémoire. ML a un modèle de performance de composition (c'est-à-dire que le coût temps / espace d'un programme peut être calculé à partir des coûts temps / espace de ses sous-termes), comme le ferait un véritable langage d'appel par nom. Haskell réel est implémenté avec appel par besoin, une sorte de mémorisation, et par conséquent ses performances ne sont pas de composition - le temps qu'une expression liée à une variable prend pour évaluer dépend de si elle a été utilisée auparavant ou non. Cela n'est pas modélisé dans la sémantique à laquelle j'ai fait allusion ci-dessus.
Si vous voulez prendre les propriétés intensionnelles plus au sérieux, alors ML et Haskell commencent à montrer des différences plus sérieuses. Il est probablement encore possible de leur concevoir un métalangage commun, mais l'interprétation des types différera de manière beaucoup plus systématique, liée à l'idée théoriquement de la preuve de la focalisation . Un bon endroit pour en savoir plus est la thèse de doctorat de Noam Zeilberger.