Tôi đang cố gắng tạo kiểu dữ liệu của riêng mình, đây sẽ là một phần của lớp Monad, nhưng
newtype Container a = Container a deriving Monad
cho tôi lỗi này:
* Can't make a derived instance of `Monad Container'
(even with cunning GeneralizedNewtypeDeriving):
cannot eta-reduce the representation type enough
* In the newtype declaration for `Container'
|
30 | newtype Container a = Container a deriving Monad
Nó hoạt động tốt đối với các lớp khác (Ví dụ: Hiển thị), nhưng không phải cho Monad, vậy làm cách nào tôi có thể thuyết phục ghci để thể hiện lớp Container của mình sang lớp Monad?
Cảm ơn
GenerlizedNewtypeDerivingđặc biệt để "nâng" các thể hiện của kiểu được bọc sang loại mới. Câu hỏi về cách (hoặc nếu) người ta có thể tự động lấy ra một Monadví dụ cho Containervẫn còn thú vị. (Thực tế basexác định Monadví dụ Identityrõ ràng cho thấy bạn không thể.)
Monadkhông phải là một trong những kiểu chữ mà tiêu chuẩn Haskell có sẵn để tự động xuất phát ( Showcùng với một số kiểu cơ bản khác). GHC có thể làm điều đó với (các) phần mở rộng chính xác, tôi tin.
GeneralizedNewtypeDerivingđược bật và một câu hỏi là tại sao nó vẫn không hoạt động.
akhông phải là một ví dụ của đơn nguyên, do đó nó không có nhiều ý nghĩa. Nếu bạn ví dụ sẽ sử dụngnewtype Container a = Container [a] deriving (Functor, Applicative, Monad)nó sẽ hoạt động, vì[]là một ví dụ củaMonad.