有没有办法保证Scala中的case类复制方法与类型类一起存在?

有没有办法保证Scala中的case类复制方法与类型类一起存在?,scala,shapeless,scala-macros,Scala,Shapeless,Scala Macros,在下面的示例中,我有一个类型类Foo,并且希望以某种方式保证所有符合Foo(例如BarviabarFoo)的成员都有一个复制方法,例如作为案例类生成的方法。我还没有想到一个方法来做这件事。在这种情况下,复制签名可能类似于copy(foo:F,aa:List[T]=foo.aa,maybe:Option[T]=foo.maybe):F trait Foo[F] { type T def aa(foo: F): List[T] def maybe(foo: F): Option[T] }

在下面的示例中,我有一个类型类
Foo
,并且希望以某种方式保证所有符合
Foo
(例如
Bar
via
barFoo
)的成员都有一个复制方法,例如作为
案例类生成的方法。我还没有想到一个方法来做这件事。在这种情况下,复制签名可能类似于
copy(foo:F,aa:List[T]=foo.aa,maybe:Option[T]=foo.maybe):F

trait Foo[F] {
  type T
  def aa(foo: F): List[T]
  def maybe(foo: F): Option[T]
}

final case class Bar(aa: List[String], maybe: Option[String])
object Bar {
  implicit val barFoo = new Foo[Bar] {
    type T = String
    def aa(foo: Bar): List[String] = foo.aa
    def maybe(foo: Bar): Option[T] = foo.maybe
  }
}

我无法使用类型成员完成此操作,但这里是一个带有类型参数的版本。此外,还需要向Foo添加一个方法来构造对象

trait Foo[F, T] {
  def aa(foo: F): List[T]
  def maybe(foo: F): Option[T]
  def instance(aa: List[T], maybe: Option[T]): F
}

class Bar(val aa: List[String], val maybe: Option[String]) {
  override def toString = s"Bar($aa, $maybe)"
}

object Bar {
  implicit val barFoo = new Foo[Bar, String] {
    def aa(foo: Bar): List[String] = foo.aa
    def maybe(foo: Bar): Option[String] = foo.maybe
    def instance(aa: List[String], maybe:Option[String]):Bar = new Bar(aa, maybe)
  }
}

implicit class FooOps[A, T](fooable:A)(implicit foo:Foo[A, T]) {

  def copy(aa: List[T] = foo.aa(fooable), maybe: Option[T] = foo.maybe(fooable)) = {
    foo.instance(aa, maybe)
  }

}

val r = new Bar(List(""), Option("")).copy(aa = List("asd"))

println(r)

谢谢,我正试着让它适应我的情况。看起来我很接近了。此处显示的错误是否与类型成员的错误类似?是的,我也有同样的问题。使类型类公开,以便使用其类型成员给我的错误。