简体   繁体   English

在Scala中实现通用半组实现

[英]Implementing a generic semigroup implementation in scala

I was trying to implement SemiGroup in a generic manner for most of the scala types including collections. 我试图以通用方式对包括集合在内的大多数scala类型实施SemiGroup。 But when it comes to collection, I was stuck to implement the implicit SemiGroupImplicitTypes for collections. 但是当涉及到集合时,我被困于为集合实现隐式SemiGroupImplicitTypes。

For example: If I want to implement a SemiGroup[List[T]], It expects another param for the type of elements in List, I don't want to implement SemiGroup[List[Int]], SemiGroup[List[Double]] separately, want a single implementation for implicit, which will implement it for all types of List. 例如:如果我想实现SemiGroup [List [T]],它期望List中元素类型的另一个参数,那么我就不想实现SemiGroup [List [Int]],SemiGroup [List [Double] ),则需要一个隐式实现,它将为所有类型的List实施。

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)

将其设为def:

 implicit def semigroupList[T] = new SemiGroupList[T]

You need to implement defs with type parameters: 您需要使用类型参数实现defs:

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]
}
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))

The modified version of the implementation I implemented by using def's. 我使用def实现的实现的修改版本。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM