Hmm ... Định nghĩa đó trông rất giống với một số mẫu haskell mà tôi đã thấy từ lâu.
{-# LANGUAGE ExistentialQuantification #-}
data X = forall a . X { value :: a, viewValue :: a -> String }
instance Show X where show (X { value = x, viewValue = f}) = f x
sample :: [X]
sample = [X 3 show, X "abc" show, X 3.14 show]
Khi constructor X
được áp dụng ∀ thực sự trở thành ∃. Lưu ý rằng khi bạn lấy ra, value
bạn không biết loại và có bộ hoạt động trống trên nó. Nhưng vì viewValue
nó phù hợp với value
nó có thể được áp dụng cho nó.
Tôi đoán sự khác biệt chính của Java interface
mà bạn đề xuất là thực tế là bạn phải biết loại trung gian để truyền kết quả op₁
cho op₂
. Tức là hệ thống thích hợp cho loại tồn tại nên chọn đúng loại được đảm bảo tồn tại theo điều kiện. Tức là bạn sẽ có thể viết hàm với loại : ∀X. X→(X→boolean)→T
. Trong mẫu trước, hàm như vậy là hàm X
tạo được sử dụng trong X 3 show
( show
là hàm lấy đối số của bất kỳ kiểu nào thực hiện Show
và trả về String
)
Đã cập nhật: Tôi vừa đọc lại câu hỏi của bạn và tôi nghĩ rằng tôi đã xây dựng đúng cho Java:
interface T {
boolean op₂();
}
...
T x = new T() {
private final int op₁ = ...;
public boolean op₂() { return ((op₁ % 2) == 0); }
};
T y = new T() {
private final char op₁ = ...;
public boolean op₂() { return ('0' <= op₁ && op₁ <= '9'); }
};
if (x.op₂() && y.op₂()) ...
Bạn đã đúng khi đề cập this
- thực sự đó là op của bạn.
Vì vậy, tôi đoán bây giờ tôi đã hiểu rằng các ngôn ngữ OOP cổ điển (Java, C #, C ++, v.v.) luôn thực hiện kiểu tồn tại với một giá trị duy nhất this
và một hàm trên nó được gọi là "phương thức" được gọi ngầm với giá trị đó :)
PS Xin lỗi, tôi không quen thuộc lắm với Java, nhưng tôi hy vọng bạn đã có ý tưởng.