Tüm sayıların Monoid
örneğini yapmak istediğimi varsayalım. Bunun yerine böyle her Num
için bir örnek oluşturmak zorunda:Bir tür için değil, Haskell'de bir sınıf için bir sınıf örneği yapabilir misiniz?
instance Monoid Int where
mappend = (+)
mempty = 0
instance Monoid Float where
mappend = (+)
mempty = 0.0
-- etc
Böyle bir şey var mı?
instance Num t => Monoid t where
mappend = (+)
mempty = 0
Düzenleme
Bazı GHC uzantıları ile yanıtlayan ve potansiyel sorunlar hakkında uyarıda bulunuyorlar; Bunu bilgilendirici buldum, ama sanırım Sum
, Product
ve coerce
ne yaparsa yapmam.
aradığınız şey zaten var - ama rakamlar için birden fazla olası Monoid var - bu yüzden "Sum" ve "Product" için de var (DataMonoid'e bakınız) (https: //hackage.haskell .org/package/base-4.8.1.0/docs/Data-Monoid.html # t: Monoid)) – Carsten
@Carsten Şimdi 'Sum' hakkında bildiğim şu şeyi yapabilirim: 'mconcat ([1,2]) :: Sum Int) ', hangi güzel, ama yapamam mconcat ([1,2] :: Sum Float)', ne de mconcat ([1,2] :: Toplam Fraksiyonel) '. Float's ve 'Double's için' Sum' kullanmanın uygun yolu nedir? –
İlk işe nasıl başladığına dair hiçbir fikrim yok - ama 'mconcat ([1,2] :: [Sum Float])' benim için iyi çalışıyor;) – Carsten