Je suis venu récemment pour se rendre compte que d' un certain nombre de problèmes , j'ai eu il y a quelques années à essayer de mettre en œuvre diverses théories mathématiques en Java est venu au fait que le système de frappe en Java est pas suffisamment forte pour modéliser l' ensemble de la théorie de type dépendant Martin-Löf .
Avant Java 5 et génériques, la seule théorie du type que vous pouvez faire est à travers des cours et des interfaces, qui vous donnent des types arbitraires construits sur les types de sol int
, double
, char
et ainsi sur l' utilisation de types de produits et de fonction. Vous pouvez également créer des types récursifs tels que List
s, mais pas de manière uniforme.
En utilisant des génériques, vous pouvez faire un peu plus. Vous pouvez maintenant définir List<T>
comme une fonction
et nous obtenons donc des types d'ordre supérieur.
Ce n'est pas la fin de l'histoire, cependant. En utilisant une astuce générique, nous pouvons modéliser certains types de produits dépendants. Par exemple, nous pouvons définir des types de la forme utilisant la syntaxe
public interface f<T extends f<T>>
{
// We can now refer to T as much as we like
// inside the class. T has type f<T>.
}
À titre d'exemple, nous pouvons modéliser la structure sous-jacente de base d'un monoïde (mais pas les conditions d'associativité et d'unité) en utilisant un terme de type ( c'est-à-dire un ensemble avec un élément unité désigné et une opération binaire sur ). En utilisant des génériques Java, nous pouvons modéliser ce type:
public interface MonoidElement<T extends MonoidElement<T>>
{
public T unit();
public T mul(T op1, T op2);
}
Cependant, lorsque nous essayons de modéliser des concepts plus compliqués, la théorie des types tombe en panne.
Existe-t-il une description simple du fragment de MLTT correspondant aux types pouvant être construits dans le système de typage Java?