如何在 Scala 中为泛型类型提供默认类型类?
How to provide a default typeclass for generic types in Scala?
在 Scala 中,如果您创建一个类型类,比如代数结构 Monoid[T]
,您可以为不同类型的幺半群提供许多默认类型类实现。
假设一个幺半群被定义为:
trait Monoid[T] {
def op(x: T, y: T): T
def id: T
}
由于 String
s 在串联操作下形成一个幺半群,我们可以像这样为 String
s 提供一个默认的幺半群:
implicit object StringMonoid extends Monoid[String] {
override def op(a: String, b: String): String = a + b
override def id: String = ""
}
这很容易,因为 String
不是通用类型。
我要问的是如何为 Seq[T]
s 提供默认的幺半群,其中类型参数阻止我像我那样创建隐式对象以上。
我能做到:
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]
...
但是这种方法没有利用通用类型的优点。
所以,总的来说,我的问题是:在 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
}
不重复的变化Seq[T]
:
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
}
}
}
在 Scala 中,如果您创建一个类型类,比如代数结构 Monoid[T]
,您可以为不同类型的幺半群提供许多默认类型类实现。
假设一个幺半群被定义为:
trait Monoid[T] {
def op(x: T, y: T): T
def id: T
}
由于 String
s 在串联操作下形成一个幺半群,我们可以像这样为 String
s 提供一个默认的幺半群:
implicit object StringMonoid extends Monoid[String] {
override def op(a: String, b: String): String = a + b
override def id: String = ""
}
这很容易,因为 String
不是通用类型。
我要问的是如何为 Seq[T]
s 提供默认的幺半群,其中类型参数阻止我像我那样创建隐式对象以上。
我能做到:
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]
...
但是这种方法没有利用通用类型的优点。
所以,总的来说,我的问题是:在 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
}
不重复的变化Seq[T]
:
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
}
}
}