มันยากที่จะเพิ่มอะไรเข้าไปในคำอธิบายของ Andrej หรือ Neel แต่ฉันจะให้มันยิง ฉันจะพยายามพูดถึงมุมมองทางวากยสัมพันธ์มากกว่าพยายามที่จะเปิดเผยความหมายพื้นฐานเพราะคำอธิบายนั้นง่ายกว่าและฉันก็ให้คำตอบที่ตรงไปตรงมากับคำถามของคุณมากขึ้น
λ
การอ้างอิงที่สำคัญมีดังต่อไปนี้:
Mendler, N. (1991) ประเภทอุปนัยและข้อ จำกัด ประเภทในแคลคูลัสแลมบ์ดาอันดับสอง ฉันไม่พบข้อมูลอ้างอิงออนไลน์ฉันกลัว ข้อความและบทพิสูจน์สามารถดูได้ในวิทยานิพนธ์ระดับปริญญาเอกของ Nax (แนะนำให้อ่านอย่างละเอียด!)
Bad
Bad=Bad→A
A
λx:Bad.x x:Bad→A
และอื่น ๆ
(λx:Bad.x x) (λx:Bad.x x):A
Bad=F(Bad)
F(X)XF(X)
แน่นอนว่าคุณไม่ได้ทำงานกับประเภทที่กำหนดอย่างเท่าเทียมกัน แต่มีคอนสตรัคเตอร์เช่นคุณมี
data Bad = Pack (Bad -> A)
มากกว่าความเท่าเทียมที่เข้มงวด อย่างไรก็ตามคุณสามารถกำหนด
unpack :: Bad -> (Bad -> A)
unpack (Pack f) = f
ซึ่งเพียงพอสำหรับผลลัพธ์นี้เพื่อดำเนินการต่อ:
(\x:Bad -> unpack x x) (Pack (\x:Bad -> unpack x x))
A
ในตัวอย่างที่สองของคุณสิ่งต่าง ๆ มีความยุ่งยากมากขึ้นในขณะที่คุณมีบางสิ่งตามแนวของ
Bad=Bad′→A
Bad′BadBad aBad (Not a)
type Not a = a -> False
กับ
data Not a = Not a
มันจะแก้ไขได้อย่างง่ายดายหาก Haskell อนุญาตให้ใช้คำจำกัดความประเภทดังกล่าว:
type Acc = Not Acc
ในกรณีนี้คุณสามารถสร้าง combinator แบบวนซ้ำในลักษณะเดียวกับก่อนหน้านี้ ฉันสงสัยว่าคุณสามารถใช้สิ่งก่อสร้างที่คล้ายกัน (แต่ซับซ้อนกว่า) โดยใช้
data Acc = D (Not Acc)
ปัญหาที่นี่คือการสร้างมอร์ฟ
Bad Acc <-> Bad (Not Acc)
คุณต้องจัดการกับความแปรปรวนแบบผสม