Câu trả lời hay: Không, điều bạn đang hy vọng thực hiện không thực sự khả thi. Bạn có thể viết một thể hiện giống như nó làm những gì bạn muốn, có thể cần một số phần mở rộng GHC trong tiến trình, nhưng nó sẽ không hoạt động theo cách bạn muốn.
Câu trả lời không chính xác: Bạn có thể hoàn thành những gì bạn muốn bằng cách sử dụng siêu lập trình loại cấp độ đáng sợ, nhưng nó có thể phức tạp. Điều này thực sự không được khuyến nghị trừ khi bạn hoàn toàn cần điều này để làm việc vì một lý do nào đó.
Các trường hợp chính thức không thể thực sự phụ thuộc vào các trường hợp khác, vì GHC chỉ xem xét "trường hợp đầu" khi đưa ra quyết định và hạn chế về lớp nằm trong "ngữ cảnh". Để làm một cái gì đó giống như một "loại từ đồng nghĩa" ở đây, bạn sẽ phải viết những gì trông giống như một thể hiện của Monad
cho tất cả các loại có thể, mà rõ ràng là không có ý nghĩa. Bạn sẽ được chồng chéo với các phiên bản khác của Monad
, trong đó có vấn đề riêng của mình. Trước hết, tôi không nghĩ rằng một trường hợp như vậy sẽ đáp ứng các yêu cầu kiểm tra chấm dứt đối với độ phân giải ví dụ, vì vậy bạn cũng cần mở rộng UndecidableInstances
, có nghĩa là khả năng viết các trường hợp sẽ gửi loại GHC kiểm tra vào một vòng lặp vô hạn.
Nếu bạn thực sự muốn đi xuống hố thỏ đó, hãy duyệt qua trên Oleg Kiselyov's website một chút; anh ấy là một vị thánh bảo trợ của chương trình siêu lập trình loại ở Haskell.
Đó là công cụ thú vị, để chắc chắn, nhưng nếu bạn chỉ muốn viết mã và làm cho nó hoạt động, có lẽ không đáng để giảm đau.
Chỉnh sửa: Được rồi, tôi đã phóng đại vấn đề ở đây. Một cái gì đó như PhantomMonad
hoạt động tốt như một lần duy nhất và nên làm những gì bạn muốn, với các tiện ích mở rộng Overlapping
- và UndecidableInstances
GHC. Những thứ phức tạp bắt đầu khi bạn muốn làm bất cứ điều gì phức tạp hơn những gì trong câu hỏi. Lời cảm ơn chân thành của tôi đến Norman Ramsey đã gọi tôi về điều đó - tôi thực sự nên biết rõ hơn.
Tôi vẫn không thực sự khuyên bạn nên thực hiện loại điều này mà không có lý do chính đáng, nhưng nó không tệ như tôi đã tạo ra âm thanh. Mea culpa.
Nguồn
2010-05-20 20:16:37
Là «preturn :: a -> p b' một lỗi đánh máy? –