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
}
orada pek çok yerde '' Dizi [T] tekrarlamak için bir yol ? –
Bu, 'Monoid [Seq [T]]' ne her gerektiğinde yeni bir nesne oluşturmaz mı? –
@YuhuanJiang Evet, ancak jenerik olmasını istiyorsanız gerçekten bir seçeneğiniz yok. –