我有几个带有 count 字段的案例类。默认情况下它是 1,我的代码中有一个 reduce,它对重复项进行分组并对该值求和以找到每个对象的数量。例如。:

case class Person(name: String, count = 1)
personList.groupBy(_.name).reduce((x,y) => x.copy(count = x.count + 1))

我在几个案例类中都有这个逻辑,因为我的逻辑比上面的例子复杂一些,所以我想创建一个通用的合并函数。

所以我创建了一个带有 sealed trait 字段的 count。然后我更改了我的案例类以从这里扩展,例如:
case class Person(name: String, override val count) extends Countable

到现在为止还挺好。

但是,我无法弄清楚如何声明我的 merge 函数,以便它只接受扩展 Countable 的案例类。因此,它找不到 copy 方法。

这是我所拥有的:
  def merge[T <: Countable](f: T => Seq[String])(ms: Seq[T]): Vector[T] =
    ms.groupBy(x => f(x).mkString("_")).mapValues(_.reduce { (x,y) =>
     x.copy(count = x.count + 1)        // can't find `copy`
  }).values.toVector

是否有我也可以包含的类型类,这意味着使用 Scala 2.11.7 的类型具有 copy 方法(或者是案例类)?

更新:
Countable 特性是:
sealed trait Countable {

  def timesSeen: Long = 1
}

最佳答案

你是如何定义你的 Countable 特质的。
以下代码段对我来说很好用:

  trait Countable[Z] {
    def count: Int
    def copy: Z
  }

  case class Person(name: String, override val count: Int) extends Countable[Person] {
    override def copy: Person = this
  }

  def merge[T <: Countable[T]](f: T => Seq[String])(ms: Seq[T]): Vector[T] = {
    val r = ms.groupBy(x => f(x).mkString("_")).mapValues(_.reduce { (x, y) =>
      x.copy
    }).values.toVector
    r
  }

10-08 13:20