ฉันต้องการกำหนดคลาสประเภทสำหรับวัตถุทางเรขาคณิตที่สามารถตัดกันด้วยกัน:
class Intersect a b c | a b -> c where
intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies
แนวคิดก็คือมีฟังก์ชั่นการตัดกันที่ใช้งานทั่วไปที่สามารถจัดการกับวัตถุประเภทต่างๆ หนึ่งสามารถจินตนาการกรณีเช่น
instance Intersect Line Plane (Maybe Point) where
...
instance Intersect Plane Plane (Maybe Line) where
...
แต่ฉันก็อยากจะประกาศด้วยว่าการตัดกันนั้นเป็นการสลับ:
instance (Intersect a b c) => Intersect b a c where
intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances
ปัญหาคือว่าเมื่อใดก็ตามที่ผมประเมินintersect x y
โดยไม่กำหนดเช่นมีรูปแบบIntersect a b c
ที่a
เป็นประเภทของx
และb
เป็นประเภทของy
, โปรแกรมที่จะเข้าสู่วง จำกัดสันนิษฐานว่าเกิดจากการประกาศเช่น recursive เกี่ยวกับ commutativity โดยหลักการแล้วฉันต้องการให้บางสิ่งบางอย่างintersect Egg Bacon
ล้มเหลวในการตรวจสอบประเภทเนื่องจากไม่มีการกำหนดอินสแตนซ์ดังกล่าวไม่ใช่ดักจับฉันในวงวนไม่สิ้นสุด ฉันจะใช้สิ่งนี้ได้อย่างไร