Giả sử tôi muốn đặt tất cả các số là phiên bản Monoid
. Thay vì phải tạo một phiên bản cho mỗi Num
như sau:Bạn có thể tạo một thể hiện của một lớp không phải cho một loại mà cho cả một lớp trong Haskell không?
instance Monoid Int where
mappend = (+)
mempty = 0
instance Monoid Float where
mappend = (+)
mempty = 0.0
-- etc
Có điều gì tương tự không?
instance Num t => Monoid t where
mappend = (+)
mempty = 0
Sửa
Một số đang trả lời với phần mở rộng GHC và cảnh báo về các vấn đề tiềm năng; Tôi thấy rằng thông tin, nhưng tôi nghĩ rằng tôi sẽ dính với Sum
, Product
và bất cứ điều gì coerce
nào.
những gì bạn đang tìm kiếm đã có sẵn - nhưng có nhiều hơn một Monoids có thể cho số - đó là lý do tại sao nó có 'Sum' và' Product' ([xem Data.Monoid] (https: //hackage.haskell) .org/package/base-4.8.1.0/docs/Data-Monoid.html # t: Monoid)) – Carsten
@Carsten Vì vậy, bây giờ tôi biết về 'Sum', tôi có thể làm điều này:' mconcat ([1,2] :: Sum Int) ', là tốt đẹp, nhưng tôi không thể làm' mconcat ([1,2] :: Sum Float) ', cũng không' mconcat ([1,2] :: Sum Fractional) '. Cách thích hợp để sử dụng 'Sum' cho' Float 'và' Double 'là gì? –
Tôi không biết đầu tiên bạn làm việc đầu tiên như thế nào - nhưng 'mconcat ([1,2] :: [Sum Float])' hoạt động tốt cho tôi;) – Carsten