【问题标题】:Implementing a generic semigroup implementation in scala在scala中实现一个通用的半群实现
【发布时间】:2018-09-28 03:59:05
【问题描述】:

我试图以通用方式为大多数 scala 类型(包括集合)实现 SemiGroup。但是在集合方面,我坚持为集合实现隐式 SemiGroupImplicitTypes。

例如:如果我想实现一个 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)

【问题讨论】:

  • 请注意,Semigroup 现在或多或少是半标准化的:Semigroup.scala
  • 你能解释一下吗?

标签: scala functional-programming


【解决方案1】:

让它成为一个定义:

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

【讨论】:

  • 其实我刚才也实现了。
【解决方案2】:

你需要用类型参数来实现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]
}

【讨论】:

    【解决方案3】:
    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实现的修改版本。

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多