Tôi muốn định nghĩa một lớp loại cho các đối tượng hình học có thể được giao nhau:
class Intersect a b c | a b -> c where
intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies
Ý tưởng là để có một chức năng giao cắt mục đích chung có thể xử lý các đối tượng thuộc các loại khác nhau. Người ta có thể tưởng tượng những trường hợp như
instance Intersect Line Plane (Maybe Point) where
...
instance Intersect Plane Plane (Maybe Line) where
...
Nhưng tôi cũng muốn tuyên bố rằng giao lộ là giao hoán:
instance (Intersect a b c) => Intersect b a c where
intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances
Vấn đề là bất cứ khi nào tôi đánh giá intersect x y
mà không xác định trước một thể hiện của biểu mẫu Intersect a b c
, đâu a
là loại x
và b
là loại y
, chương trình sẽ đi vào một vòng lặp vô hạn , có lẽ là do khai báo thể hiện đệ quy về giao hoán. Lý tưởng nhất là tôi muốn một cái gì đó intersect Egg Bacon
không thể kiểm tra kiểu vì không có trường hợp nào được xác định, không bẫy tôi trong một vòng lặp vô hạn. Làm thế nào tôi có thể thực hiện điều này?