หมายเหตุเริ่มต้น:
คำถามนี้ถูกปิดหลังจากการแก้ไขหลายครั้งเพราะฉันไม่มีคำศัพท์ที่เหมาะสมในการระบุสิ่งที่ฉันกำลังมองหาอย่างถูกต้อง Sam Tobin-Hochstadt จากนั้นโพสต์ความคิดเห็นซึ่งทำให้ฉันรู้ว่ามันคืออะไร: ภาษาการเขียนโปรแกรมที่สนับสนุนประเภทจุดตัดสำหรับค่าส่งคืนของฟังก์ชัน
ตอนนี้คำถามได้ถูกเปิดอีกครั้งฉันตัดสินใจที่จะปรับปรุงโดยการเขียนใหม่อีกครั้ง (หวังว่า) จะแม่นยำยิ่งขึ้น ดังนั้นคำตอบและความคิดเห็นบางอย่างด้านล่างอาจไม่เหมาะสมอีกต่อไปเพราะอ้างถึงการแก้ไขก่อนหน้า (โปรดดูประวัติการแก้ไขคำถามในกรณีเช่นนี้)
มีภาษาการเขียนโปรแกรมที่ได้รับความนิยมและคงที่หรือไม่ (เช่น Haskell, Java ทั่วไป, C #, F # และอื่น ๆ ) ที่รองรับประเภทจุดตัดสำหรับค่าส่งคืนฟังก์ชันหรือไม่ ถ้าเป็นเช่นนั้นจะทำอะไรและอย่างไร
(ถ้าฉันซื่อสัตย์ฉันชอบที่จะเห็นใครบางคนสาธิตวิธีการแยกประเภทในภาษาหลักเช่น C # หรือ Java)
ฉันจะให้ตัวอย่างรวดเร็วของประเภทจุดตัดที่อาจมีลักษณะโดยใช้บาง pseudocode คล้ายกับ C #:
interface IX { … }
interface IY { … }
interface IB { … }
class A : IX, IY { … }
class B : IX, IY, IB { … }
T fn() where T : IX, IY
{
return … ? new A()
: new B();
}
นั่นคือฟังก์ชั่นfn
ส่งกลับตัวอย่างของประเภทบางT
ซึ่งโทรเท่านั้นที่รู้ว่ามันใช้อินเตอร์เฟซและIX
IY
(นั่นคือแตกต่างจาก generics ผู้โทรไม่ได้เลือกชนิดที่เป็นรูปธรรมของT
- ฟังก์ชั่นทำจากนี้ฉันจะสมมติว่าที่T
จริงแล้วไม่ใช่ประเภทสากล แต่เป็นประเภทที่มีอยู่)
PS:ฉันรู้ว่าหนึ่งก็สามารถกำหนดinterface IXY : IX, IY
และเปลี่ยนประเภทการกลับมาของการfn
IXY
อย่างไรก็ตามนั่นไม่ใช่สิ่งเดียวกันเพราะบ่อยครั้งที่คุณไม่สามารถเชื่อมต่ออินเทอร์เฟซเพิ่มเติมIXY
กับประเภทที่กำหนดไว้ก่อนหน้านี้A
ซึ่งใช้IX
และIY
แยกกันเท่านั้น
เชิงอรรถ: ทรัพยากรบางอย่างเกี่ยวกับประเภทสี่แยก:
บทความวิกิพีเดีย"ประเภทระบบ"มีส่วนย่อยเกี่ยวกับประเภทสี่แยก
รายงานโดย Benjamin C. Pierce (1991), "Programming with Intersection Types, Union Type, Polymorphism"
David P. Cunningham (2005), "Intersection Types in practice"ซึ่งมีกรณีศึกษาเกี่ยวกับภาษา Forsythe ซึ่งถูกกล่าวถึงในบทความ Wikipedia
สแต็คโอเวอร์โฟลคำถาม"ยูเนี่ยนประเภทและประเภทการตัดกัน"ซึ่งได้คำตอบที่ดีหลายประการในหมู่พวกเขาอันนี้ซึ่งให้ตัวอย่างรหัสเทียมของประเภทการแยกที่คล้ายกับของฉันด้านบน
T
อินเตอร์เฟสเป็นอินเทอร์เฟซI
เมื่อใช้วิธีการทั้งหมดของอินเทอร์เฟซ แต่ไม่ได้ประกาศอินเทอร์เฟซนั้น"
T
กำหนดประเภทแม้ว่ามันจะถูกกำหนดไว้ในการประกาศฟังก์ชั่นเป็น "บางประเภทที่ขยาย / นำไปใช้IX
และIY
" ความจริงที่ว่าเกิดขึ้นจริงค่าตอบแทนเป็นกรณีพิเศษที่ (A
หรือB
ตามลำดับ) ไม่ได้อะไรเป็นพิเศษที่นี่คุณสามารถเช่นเดียวกับดีบรรลุว่าด้วยการใช้แทนObject
T