0

以下の 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 だけで十分ですか?それとも2つの組み合わせが必要ですか?それとも他の方法ですか?

4

1 に答える 1

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)
}
于 2017-01-11T23:25:57.240 に答える