Le concept essentiel s’applique universellement d’une certaine manière, oui, mais rarement de manière utile.
Pour commencer, du point de vue de la théorie des types, les langages "dynamiques" sont considérés comme ayant un seul type, qui contient (entre autres) des métadonnées sur la nature de la valeur vue par le programmeur, y compris ce que ces langages dynamiques appellent un "type" eux-mêmes (ce qui n'est pas la même chose, conceptuellement). De telles preuves étant susceptibles de ne pas être intéressantes, ce concept concerne principalement les langages utilisant des systèmes de types statiques.
En outre, de nombreuses langues supposées avoir un "système de types statiques" doivent être considérées comme dynamiques dans la pratique, dans ce contexte, car elles permettent l'inspection et la conversion de types au moment de l'exécution. En particulier, cela signifie toute langue avec un support intégré par défaut pour la "réflexion" ou autre. C #, par exemple.
Haskell présente une quantité inhabituelle d'informations attendues par un type. En particulier, les fonctions ne peuvent dépendre d'aucune valeur autre que celles spécifiées comme arguments. En revanche, dans une langue avec des variables globales modifiables, toute fonction peut (potentiellement) inspecter ces valeurs et modifier le comportement en conséquence. Ainsi, une fonction de Haskell avec type A -> B
peut être considérée comme un programme miniature prouvant que cela A
implique B
; une fonction équivalente dans de nombreuses autres langues ne ferait que nous dire que A
, quel que soit l'état global combiné, cela implique B
.
Notez que bien que Haskell prenne en charge des éléments tels que les types de réflexion et les types dynamiques, l' utilisation de telles fonctionnalités doit être indiquée dans la signature de type d'une fonction; de même pour l'utilisation de l'état global. Ni est disponible par défaut.
Il existe également des moyens de casser des choses dans Haskell, par exemple en autorisant des exceptions d'exécution ou en utilisant des opérations primitives non standard fournies par le compilateur, mais il existe de fortes espérances sur le fait qu'elles ne seront utilisées que si elles sont parfaitement comprises ». t endommager le sens du code externe. En théorie, on pourrait en dire autant des autres langues, mais dans la plupart des autres langues, il est plus difficile de faire des choses sans "tricher" et moins mal vu de "tricher". Et bien sûr, dans les vrais langages "dynamiques", le tout reste sans importance.
Le concept peut également être poussé beaucoup plus loin qu’en Haskell.