2015-09-24 26 views
8

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.

+6

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

+1

@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? –

+0

İ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

cevap

21

Bunu, özellikle Monoid ve Num'dan ziyade genel bir öneri sormak olarak yorumluyorum.

Belki de çalışmaya çalışırken yazdığınız şeyleri alabilir, FlexibleInstances, UndecidableInstances ve örtüşen örnekleri kullanarak.

Ama hiç muhtemelen istemem: Bu instance Num t => Monoid t where ... gibi görünüyor

söylediğini " t Num örneğidir burada olduğunu t Monoid örneğidir nasıl olursa ..."

Maalesef bu doğru değil. Ya aslında söylüyor daha

gibi

Böylece, bir örnek beyanı yazarsanız "İşte, bu tNum. Sonraki bir örneği olması gerekli tMonoid. Birinci örneğidir nasıl ... var" Bunun gibi başka örnek beyanları yazamazsınız. (En azından kendi sorunlarını getirecek olan OverlappingInstances olmadan.)

6

GHC bazı dil uzantılarını kullanarak tanım Bu 5 yılında 2 <> 3 sonucu yapar

{-# LANGUAGE FlexibleInstances, UndecidableInstances #-} 

instance Num t => Monoid t where 
    mappend = (+) 
    mempty = 0 

etkin sağlar. Overlapping instances for Monoid [Char]

Yani, kısa cevap olduğunu düşünüyorum:: hayır

Ama bu diğer Monoid durumlarda örtüştüğünü

, böylece bir hatayla "Hello" <> "World" sonuçlarını değerlendirmek için çalışıyor.

İlgili konular