Giả sử tôi có lớp sau:Haskell lớp kế thừa kiểu
class P a where
nameOf :: a -> String
Tôi muốn tuyên bố rằng tất cả các trường của lớp này sẽ được tự động trường hợp của Show
. Nỗ lực đầu tiên của tôi sẽ là như sau:
instance P a => Show a where
show = nameOf
nỗ lực đầu tiên của tôi để đi theo con đường này ngày hôm qua dẫn đến một warren thỏ các phần mở rộng ngôn ngữ: trường tôi lần đầu tiên được biết đến bật trường hợp linh hoạt, các trường hợp sau đó undecidable, sau đó chồng chéo, và cuối cùng nhận được lỗi về khai báo cá thể chồng chéo. Tôi đã từ bỏ và quay trở lại để lặp lại mã. Tuy nhiên, điều này về cơ bản có vẻ giống như một nhu cầu rất đơn giản, và một trong đó phải dễ dàng hài lòng.
Vì vậy, hai câu hỏi:
- Có cách nào trivially dễ dàng để làm điều này mà tôi vừa bỏ lỡ?
- Tại sao tôi gặp sự cố chồng chéo? Tôi có thể thấy lý do tại sao tôi có thể cần
UndecidableInstances
, vì tôi dường như vi phạm điều kiện Paterson, nhưng không có trường hợp trùng lặp nào ở đây: không có trường hợp nào củaP
, kể cả. Tại sao người đánh máy lại tin rằng có nhiều trường hợp choShow Double
(như trường hợp trong ví dụ đồ chơi này)?
Sự chồng chéo (và độ phân giải quá tải) được xác định bởi chỉ phần đầu thể hiện 'Hiển thị a', vì vậy nó thực sự trùng lặp với mỗi thể hiện' Hiển thị' khác. – augustss
Giả sử bạn khai báo cá thể của 'P Int' và bạn đã có một cá thể cho' Hiển thị Int' để điều này sẽ dẫn đến các trường hợp chồng chéo cho Hiện. – Satvik
@Satvik Chắc chắn, ngoại trừ việc tôi không có một phiên bản 'P Int' xung quanh. Tôi sẽ mong đợi một lỗi nếu tôi cố gắng tạo một 'P Int', nhưng không phải bằng cách tuyên bố rằng nó có thể tồn tại. – Impredicative