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 Monad
ví dụ cho Container
vẫn còn thú vị. (Thực tế base
xác định Monad
ví dụ Identity
rõ ràng cho thấy bạn không thể.)
Monad
khô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 ( Show
cù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.
a
khô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
.