อืม ... คำจำกัดความนั้นดูคล้ายกับตัวอย่างของฮาเซลบางอย่างที่ข้าเคยเห็นมานานแล้ว
{-# 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]
เมื่อตัวสร้างXถูกนำไปใช้∀จริงกลายเป็น∃ โปรดทราบว่าเมื่อคุณนำออกvalueคุณไม่ทราบประเภทและมีชุดของการดำเนินการที่ว่างเปล่า แต่เนื่องจากviewValueมีความสอดคล้องกันกับvalueมันจึงสามารถใช้กับมันได้
ผมคิดว่าแตกต่างหลักของ Java interfaceที่คุณนำเสนอเป็นความจริงที่คุณต้องรู้ประเภทสื่อกลางสำหรับการส่งผ่านผลมาจากการop₁ op₂คือระบบที่เหมาะสมสำหรับประเภทที่มีอยู่ควรเลือกประเภทที่เหมาะสมซึ่งรับประกันว่าจะมีอยู่ตามเงื่อนไข ∀X. X→(X→boolean)→Tคือคุณควรจะสามารถที่จะเขียนฟังก์ชั่นที่มีประเภท: ในตัวอย่างก่อนหน้าฟังก์ชั่นดังกล่าวเป็นตัวXสร้างที่ใช้ในX 3 show( showเป็นฟังก์ชั่นที่จะโต้แย้งประเภทใด ๆ ที่ดำเนินการShowและผลตอบแทนString)
อัปเดต:ฉันเพิ่งอ่านคำถามของคุณอีกครั้งและฉันคิดว่าฉันมีโครงสร้างที่เหมาะสมสำหรับ 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₂()) ...
คุณพูดถูกแล้วthis- มันคือ opap ของคุณ
ดังนั้นฉันเดาว่าตอนนี้ฉันเข้าใจแล้วว่าภาษา OOP แบบคลาสสิก (Java, C #, C ++ ฯลฯ ) มักจะใช้ประเภทอัตถิภาวนิยมด้วยค่าเดียวthisและฟังก์ชั่นที่เรียกว่า "เมธอด" ซึ่งเรียกว่าโดยนัย
ป.ล. ขออภัยฉันไม่คุ้นเคยกับ Java มาก แต่หวังว่าคุณจะมีความคิด