2015-06-06 11 views
6

Scala'da, bir typeclass oluşturursanız, Monoid[T] cebirsel yapısını söyleyin, monoids olan farklı türlerde birçok varsayılan typeclass uygulaması sağlayabilirsiniz.Scala'da genel türler için varsayılan bir typeclass nasıl sağlanabilir?

bir Monoid varsayalım olarak tanımlanır: birleştirme işlemi formu altında

trait Monoid[T] { 
    def op(x: T, y: T): T 
    def id: T 
} 

String yana s bir monoid, böyle String s için varsayılan bir Monoid sağlayabilir:

implicit object StringMonoid extends Monoid[String] { 
    override def op(a: String, b: String): String = a + b 
    override def id: String = "" 
} 

budur oldukça kolay, çünkü String genel bir tür değil.

Ne için soruyorum tür parametresi yukarıda yaptığım gibi örtük bir nesne oluşturmasını beni engelleyen hangi Seq[T] s, için bir varsayılan Monoid nasıl sağlanacağı olduğunu.

yapabileceğim:

class SeqMonoid[T] extends Monoid[Seq[T]] { 
    override def op(a: Seq[T], b: Seq[T]): Seq[T] = a ++ b 
    override def id: Seq[T] = Nil 
} 
implicit object intSeqMonoid extends SeqMonoid[Int] 
implicit object doubleSeqMonoid extends SeqMonoid[Double] 
implicit object stringSeqMonoid extends SeqMonoid[String] 
... 

Ama bu yaklaşım genel türler güzelliği kullanmaz.

Genel olarak, sorum şu: Scala'da, genel türleri için typeclass uygulamalarını sağlayabileceğim herhangi bir yol var mı? Seq[T] tekrarlamadan

implicit def SeqMonoid[T]: Monoid[Seq[T]] = new Monoid[Seq[T]] { 
    override def op(a: Seq[T], b: Seq[T]): Seq[T] = a ++ b 
    override def id: Seq[T] = Nil 
} 

cevap

7

Gerekli türü ile örtülü bir işlevi sağlayabilir

object Monoid { 
    implicit def seqMonoid[T]:Monoid[Seq[T]] = { 
    type S = Seq[T] 
    new Monoid[S] { 
    def op(x: S, y: S) = x ++ y 
    def id = Nil 
    } 
    } 
} 
+1

orada pek çok yerde '' Dizi [T] tekrarlamak için bir yol ? –

+1

Bu, 'Monoid [Seq [T]]' ne her gerektiğinde yeni bir nesne oluşturmaz mı? –

+0

@YuhuanJiang Evet, ancak jenerik olmasını istiyorsanız gerçekten bir seçeneğiniz yok. –

0

Varyasyon:

+2

Bunu daha az idiyomik ve okumayı daha çok düşünürdüm. –

İlgili konular