首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala中实现泛型半群实现

在scala中实现泛型半群实现
EN

Stack Overflow用户
提问于 2018-09-28 03:25:56
回答 3查看 76关注 0票数 0

我试图以一种通用的方式为包括集合在内的大多数scala类型实现SemiGroup。但是当涉及到集合时,我坚持实现集合的隐式SemiGroupImplicitTypes。

例如:如果我想实现一个SemiGroup[ListT],它需要列表中的元素类型的另一个参数,我不想单独实现SemiGroup[ListInt],SemiGroup[ListDouble],我想要一个隐式的实现,它将为所有类型的列表实现它。

代码语言:javascript
复制
trait Semigroup[T] extends Any {
  def combine(a: T, b: T): T
}

object SemiGroup {
  def apply[T](a: T, b: T)(implicit ev: Semigroup[T]): T = ev.combine(a,b)
}

class SemiGroupList[T] extends Semigroup[List[T]] {
  override def combine(a: List[T], b: List[T]): List[T] = a ++ b
}

class SemiGroupSeq[T] extends Semigroup[Seq[T]] {
  override def combine(a: Seq[T], b: Seq[T]): Seq[T] = a ++ b
}

class SemiGroupMap[U, V] extends Semigroup[Map[U,V]] {
  override def combine(a: Map[U, V], b: Map[U, V]): Map[U, V] = a ++ b
}

class SemiGroupNumber[@specialized (Int, Double, Float, Long) T](implicit numeric: Numeric[T]) extends Semigroup[T] {
  override def combine(a: T, b: T): T = numeric.plus(a, b)
}

object SemiGroupImplicitTypes {
  implicit object IntSemiGroup extends SemiGroupNumber[Int]
  implicit object LongSemiGroup extends SemiGroupNumber[Long]
  implicit object DoubleSemiGroup extends SemiGroupNumber[Double]
  implicit object FloatSemiGroup extends SemiGroupNumber[Float]
}


import SemiGroupImplicitTypes._
SemiGroup[Long](1,2)
EN

回答 3

Stack Overflow用户

发布于 2018-09-28 03:57:24

将其设为def:

代码语言:javascript
复制
 implicit def semigroupList[T] = new SemiGroupList[T]
票数 1
EN

Stack Overflow用户

发布于 2018-09-28 03:58:08

您需要实现带类型参数的defs:

代码语言:javascript
复制
object SemiGroupImplicitTypes {
    implicit object IntSemiGroup extends SemiGroupNumber[Int]
    implicit object LongSemiGroup extends SemiGroupNumber[Long]
    implicit object DoubleSemiGroup extends SemiGroupNumber[Double]
    implicit object FloatSemiGroup extends SemiGroupNumber[Float]

    implicit def listSemiGroup[T]: Semigroup[List[T]] = new SemiGroupList[T]
}
票数 1
EN

Stack Overflow用户

发布于 2018-09-28 03:59:05

代码语言:javascript
复制
trait Semigroup[T] extends Any {
  def combine(a: T, b: T): T
}

object SemiGroup {
  def apply[T](a: T, b: T)(implicit ev: Semigroup[T]): T = ev.combine(a,b)
}

class SemiGroupList[T] extends Semigroup[List[T]] {
  override def combine(a: List[T], b: List[T]): List[T] = a ++ b
}

class SemiGroupSeq[T] extends Semigroup[Seq[T]] {
  override def combine(a: Seq[T], b: Seq[T]): Seq[T] = a ++ b
}

class SemiGroupMap[U, V] extends Semigroup[Map[U,V]] {
  override def combine(a: Map[U, V], b: Map[U, V]): Map[U, V] = a ++ b
}

class SemiGroupNumber[@specialized (Int, Double, Float, Long) T](implicit numeric: Numeric[T]) extends Semigroup[T] {
  override def combine(a: T, b: T): T = numeric.plus(a, b)
}

object SemiGroupImplicitTypes {
  implicit def numberSemiGroup[T](implicit numeric: Numeric[T]) = new SemiGroupNumber[T]()
  implicit def listSemiGroup[T] = new SemiGroupList[T]()
  implicit def mapSemiGroup[U,V] = new SemiGroupMap[U,V]()
  implicit def seqSemiGroup[U] = new SemiGroupSeq[U]()
}

import SemiGroupImplicitTypes._


SemiGroup[Int](1,2)
SemiGroup[List[Int]](List[Int](1,2,3), List(2,3,5))

我使用def实现的实现的修改版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52543857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档