scala - 如何在 Scala 中为泛型类型提供默认类型类?

标签 scala generics types typeclass type-parameter

在 Scala 中,如果您创建一个类型类,请说代数结构 Monoid[T] ,您可以为作为幺半群的不同类型提供许多默认类型类实现。

假设一个幺半群被定义为:

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

String s在串联操作下形成幺半群,我们可以为String提供一个默认的幺半群。像这样:
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
}

关于scala - 如何在 Scala 中为泛型类型提供默认类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30680206/

相关文章:

c# - 在 C# 中对十进制数据类型执行数学运算?

scala - 调用不带 'this' 关键字的成员方法

scala - 获取 Iterable 的元素索引

c# - 比较接口(interface)的 GenericTypeDefinition

C# - 以类型安全的方式将输入对象映射到效果对象

c - size_t (SIZE_MAX) 的最大值是否相对于其他整数类型定义?

scala - 替换 csv 文件中的新行 (\n) 字符 - spark scala

scala - Scala路线图发布2.9.0

java - 通用方法适用于不同的实际参数

java - 为什么 Java 编译器在构造函数实例化中会丢失对泛型类型的跟踪?