私は最近、数年前にJavaでさまざまな数学的理論を実装しようとしていた 多く の 問題が、Javaの型付けシステムがすべてのMartin-Löf依存型理論をモデル化するほど強力ではないという事実に帰着したことに気づきました。
Java 5およびジェネリックの前は、クラスおよびインターフェースを介して型理論を実行することしかできませんでした。これにより、製品や関数の型を使用して、地上の型int
、double
などから任意の型を構築できますchar
。List
統一された方法ではありませんが、s などの再帰型を構築することもできます。
ジェネリックを使用すると、もう少し多くを行うことができます。これでList<T>
、関数として
定義できる
話はこれで終わりではありません。ジェネリックトリックを使用して、いくつかの依存製品タイプをモデル化できます。たとえば 、次の構文を使用して、という形式のタイプを定義でき
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>.
}
例として、タイプ (つまり、指定された単位要素とに対する2項演算を持つセットです。Javaジェネリックを使用して、このタイプをモデル化できます。TT
public interface MonoidElement<T extends MonoidElement<T>>
{
public T unit();
public T mul(T op1, T op2);
}
ただし、より複雑な概念をモデル化しようとすると、型理論は破綻します。
Java型付けシステムで構築できる型に対応するMLTTのフラグメントの簡単な説明はありますか?