Метод копирования и полиморфизм подтипов в 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)
}
Другие вопросы по тегам