อืม ... คำจำกัดความนั้นดูคล้ายกับตัวอย่างของฮาเซลบางอย่างที่ข้าเคยเห็นมานานแล้ว
{-# 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 มาก แต่หวังว่าคุณจะมีความคิด