如何在Scala中为泛型类型提供默认类型类?
发布时间:2020-12-16 18:57:19 所属栏目:安全 来源:网络整理
导读:在 Scala中,如果你创建一个类型类,比如代数结构Monoid [T],你可以为不同类型的monoid提供许多默认的类型类实现. 假设一个monoid定义为: trait Monoid[T] { def op(x: T,y: T): T def id: T} 由于串联操作下的字符串形成一个monoid,我们可以像这样为字符串提
在
Scala中,如果你创建一个类型类,比如代数结构Monoid [T],你可以为不同类型的monoid提供许多默认的类型类实现.
假设一个monoid定义为: trait Monoid[T] { def op(x: T,y: T): T def id: T } 由于串联操作下的字符串形成一个monoid,我们可以像这样为字符串提供一个默认的monoid: implicit object StringMonoid extends Monoid[String] { override def op(a: String,b: String): String = a + b override def id: String = "" } 这很容易,因为String不是泛型类型. 我要问的是如何为Seq [T]提供一个默认的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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |