Recentemente ho capito che una serie di problemi che ho avuto qualche anno fa nel tentativo di implementare varie teorie matematiche in Java sono dovuti al fatto che il sistema di digitazione in Java non è sufficientemente forte per modellare tutta la teoria del tipo dipendente da Martin-Löf .
Prima di Java 5 e farmaci generici, l'unico tipo teoria si potrebbe fare era attraverso le classi e interfacce, che vi danno i tipi arbitrari costruite fuori dai tipi di terreno int
, double
, char
e così via utilizzando tipi di prodotto e di funzione. Puoi anche creare tipi ricorsivi come List
s, anche se non in modo uniforme.
Usando i generici, puoi fare un po 'di più. Ora puoi definire List<T>
una funzione
e quindi otteniamo tipi di ordini superiori.
Questa non è la fine della storia, però. Usando un trucco generico, possiamo modellare alcuni tipi di prodotti dipendenti. Ad esempio, possiamo definire i tipi della forma usando la sintassi
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>.
}
Ad esempio, possiamo modellare la struttura di base di base di un monoide (ma non le condizioni di associatività e unicità) usando un termine di tipo ( cioè, un insieme con un elemento di unità designato e un'operazione binaria su ). Usando i generici Java, possiamo modellare questo tipo:
public interface MonoidElement<T extends MonoidElement<T>>
{
public T unit();
public T mul(T op1, T op2);
}
Tuttavia, quando proviamo a modellare concetti più complicati, la teoria dei tipi si rompe.
Esiste una semplice descrizione del frammento di MLTT corrispondente ai tipi che possono essere creati nel sistema di tipizzazione Java?