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

Yuhuan Jiang

在Scala中,如果您创建一个类型类,例如代数结构Monoid[T],则可以为不同的类型(如monoid)提供许多默认的类型类实现。

假设一个monoid定义为:

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

由于Strings在串联操作下形成一个monoid,因此我们可以为Strings提供一个默认的monoid,如下所示:

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

这很简单,因为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]
...

但是这种方法没有利用泛型类型的优点。

所以,总的来说,我的问题是:在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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala泛型:如何声明类型必须为case类?

来自分类Dev

如何在静态泛型方法中为T设置默认类型?

来自分类Dev

Scala如何在foreach中还原泛型类型

来自分类Dev

如何在泛型类中处理可为空的类型

来自分类Dev

检查类中泛型类型是否为特定类型

来自分类Dev

如何在泛型类中返回对象的泛型类型?

来自分类Dev

如何在泛型方法中获取泛型类型的类实例

来自分类Dev

如何在类中使用扩展的泛型类型的类型?

来自分类Dev

Scala中的泛型类型

来自分类Dev

Scala中方法的默认泛型类型

来自分类Dev

如何在 Roslyn 中检查方法参数类型/返回类型是否为泛型?

来自分类Dev

如何在Nim中使用默认泛型类型?

来自分类Dev

具有泛型的Scala类型类

来自分类Dev

Scala 自类型和泛型类

来自分类Dev

为类类型指定泛型

来自分类Dev

为类类型指定泛型

来自分类Dev

如何在我子类化的类中的Swift中返回泛型类型

来自分类Dev

Typescript中的默认泛型类型派生

来自分类Dev

如何使用泛型返回泛型类的类类型?

来自分类Dev

如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

来自分类Dev

如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

来自分类Dev

如何在没有反射的情况下确定Java中泛型属性的类类型?

来自分类Dev

如何在注解处理中获得泛型类型的合格类名?

来自分类Dev

如何在C#中收集具有泛型类型的静态类的所有“实例”?

来自分类Dev

Spring RestTemplate:如何在泛型类中定义参数类型

来自分类Dev

如何在具有泛型类型的类中启用协方差?

来自分类Dev

如何从Java中的泛型类型推断类?

来自分类Dev

如何在Java中为复杂的泛型类型创建别名?

来自分类Dev

类中的getConstructors()中的泛型类型

Related 相关文章

  1. 1

    Scala泛型:如何声明类型必须为case类?

  2. 2

    如何在静态泛型方法中为T设置默认类型?

  3. 3

    Scala如何在foreach中还原泛型类型

  4. 4

    如何在泛型类中处理可为空的类型

  5. 5

    检查类中泛型类型是否为特定类型

  6. 6

    如何在泛型类中返回对象的泛型类型?

  7. 7

    如何在泛型方法中获取泛型类型的类实例

  8. 8

    如何在类中使用扩展的泛型类型的类型?

  9. 9

    Scala中的泛型类型

  10. 10

    Scala中方法的默认泛型类型

  11. 11

    如何在 Roslyn 中检查方法参数类型/返回类型是否为泛型?

  12. 12

    如何在Nim中使用默认泛型类型?

  13. 13

    具有泛型的Scala类型类

  14. 14

    Scala 自类型和泛型类

  15. 15

    为类类型指定泛型

  16. 16

    为类类型指定泛型

  17. 17

    如何在我子类化的类中的Swift中返回泛型类型

  18. 18

    Typescript中的默认泛型类型派生

  19. 19

    如何使用泛型返回泛型类的类类型?

  20. 20

    如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

  21. 21

    如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

  22. 22

    如何在没有反射的情况下确定Java中泛型属性的类类型?

  23. 23

    如何在注解处理中获得泛型类型的合格类名?

  24. 24

    如何在C#中收集具有泛型类型的静态类的所有“实例”?

  25. 25

    Spring RestTemplate:如何在泛型类中定义参数类型

  26. 26

    如何在具有泛型类型的类中启用协方差?

  27. 27

    如何从Java中的泛型类型推断类?

  28. 28

    如何在Java中为复杂的泛型类型创建别名?

  29. 29

    类中的getConstructors()中的泛型类型

热门标签

归档