Метод копирования и полиморфизм подтипов в 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.
На первый взгляд, кажется, что о Монокле не может быть и речи (но я не уверен), пожалуйста, докажите, что я не прав, если моя интуиция не так.
ScalaZ + Shapeless, вероятно, может работать, я не уверен, как (никогда не использовал их).
1) Какой самый простой способ решить эту проблему в Scala?
2) Достаточно ли будет самого ScalaZ? Или Shapeless сам по себе достаточно? Или комбинация двух необходимых? Или, может быть, каким-то другим способом?
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)
}