Scala 中的复制方法和子类型多态性



我正在尝试解决以下Scala编译器错误。

case class CC[E](l:List[E])
trait D[E,L<:CC[E]]{
  def f(l:L):L = l.copy(l=List()) // does not compile: "found CC[E], required: L"
}

在(伪)-Haskell(没有子类型)中,这将是这样的:

 data CC = CC {l::[e]}
 'makeLens CC
 f l = l .~ _e []

目前,我正在研究ScalaZ,Shapeless和Monocle。

乍一看,Monocle似乎没有问题(虽然不确定),如果我的直觉是错误的,请证明我错了。

ScalaZ + Shapeless可能会起作用,我不确定如何工作(从未使用过它们)。

1)在Scala中解决这个问题的最简单方法是什么?

2)ScalaZ本身就足够了吗?还是无形本身就足够了?还是两者的结合是必要的?或者也许其他方式?

您可以使用 Monocle 执行以下操作:

import monocle.macros.Lenses
@Lenses
case class CC[E](l:List[E])
object D {
  def f[E](cc: CC[E]): CC[E] = CC.l.set(List())(cc)
}

最新更新