我正在尝试解决以下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可能会probably工作,我不确定如何(从未使用它们)。
1)在Scala中解决这个问题的最简单方法是什么?
2)ScalaZ本身就足够了吗?或者无形就足够了吗?或者是两个必要的组合?或者其他一些方式?
答案 0 :(得分:1)
您可以使用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)
}