Yuh*_*ang 6 generics types scala typeclass type-parameter
在Scala中,如果你创建一个类型类,比如代数结构Monoid[T]
,你可以为不同类型的monoid提供许多默认的类型类实现.
假设一个monoid定义为:
trait Monoid[T] {
def op(x: T, y: T): T
def id: T
}
Run Code Online (Sandbox Code Playgroud)
由于String
串联操作下的s形成一个monoid,我们可以为这样的String
s 提供一个默认的monoid :
implicit object StringMonoid extends Monoid[String] {
override def op(a: String, b: String): String = a + b
override def id: String = ""
}
Run Code Online (Sandbox Code Playgroud)
这很容易,因为String
它不是通用类型.
我要求的是如何为Seq[T]
s 提供一个默认的monoid,其中type参数阻止我像上面那样创建一个隐式对象.
我可以:
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]
...
Run Code Online (Sandbox Code Playgroud)
但是这种方法并没有利用泛型类型的美感.
所以,一般来说,我的问题是:在Scala中有什么办法可以为泛型类型提供类型类实现吗?
您可以提供具有所需类型的隐式函数:
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
}
Run Code Online (Sandbox Code Playgroud)