Gần đây tôi đã nhận ra rằng một số các vấn đề tôi đã có một vài năm trước đây cố gắng thực hiện các lý thuyết toán học khác nhau trong Java đi xuống đến một thực tế rằng hệ thống đánh máy trong Java là không đủ mạnh để mô hình tất cả các Martin-LOF lý thuyết loại phụ thuộc .
Trước Java 5 và Generics, nhập những lý thuyết bạn có thể làm là thông qua các lớp học và giao diện, trong đó cung cấp cho bạn các loại tùy ý xây dựng ra các loại đất int
, double
, char
và vân vân sử dụng các loại sản phẩm và chức năng. Bạn cũng có thể xây dựng các kiểu đệ quy như List
s, mặc dù không theo cách thống nhất.
Sử dụng thuốc generic, bạn có thể làm nhiều hơn một chút. Bây giờ bạn có thể định nghĩa List<T>
là một hàm
→ Loại
và do đó chúng tôi nhận được các loại thứ tự cao hơn.
Đây không phải là kết thúc của câu chuyện, mặc dù. Sử dụng một mẹo chung, chúng ta có thể mô hình hóa một số loại sản phẩm phụ thuộc. Ví dụ: chúng ta có thể định nghĩa các loại có dạng bằng cú pháp
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>.
}
Ví dụ, chúng ta có thể mô hình hóa cấu trúc cơ bản của một monoid (nhưng không phải là điều kiện đơn vị và đơn vị) bằng cách sử dụng thuật ngữ loại (nghĩa là một bộ T có chỉ định phần tử đơn vị và một hoạt động nhị phân trên T
public interface MonoidElement<T extends MonoidElement<T>>
{
public T unit();
public T mul(T op1, T op2);
}
Tuy nhiên, khi chúng ta cố gắng mô hình hóa các khái niệm phức tạp hơn, lý thuyết loại bị phá vỡ.
Có một mô tả đơn giản về đoạn MLTT tương ứng với các loại có thể được xây dựng trong hệ thống gõ Java không?