2017-01-08 1 views
0

Ich versuche, den folgenden Scala-Compiler-Fehler unten zu lösen.kopieren Methode und Subtyp Polymorphismus in 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" 
} 

In (pseudo) -Haskell (ohne Unter Typisierung) würde dies wie etwas sein:

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

Aktuell Suche in ScalaZ, Shapeless und Monocle.

Auf den ersten Blick scheint Monocle außer Frage zu stehen (nicht sicher), bitte beweisen Sie mir falsch, wenn meine Intuition falsch ist.

ScalaZ + Shapeless könnte probably Arbeit, ich bin mir nicht sicher, wie (nie benutzt).

1) Was wäre der einfachste Weg, dies in Scala zu lösen?

2) Wäre ScalaZ an sich genug? Oder Formlos an sich ist genug? Oder ist die Kombination der beiden notwendig? Oder vielleicht anders?

+0

Hmmm dies scheint eine Antwort auf sein http://www.cakesolutions.net/teamblogs/copying-sealed-trait-instances-a-journey-through -Generisch-Programmierung-und-formlos – jhegedus

+0

Dies ist auch verwandt: http://Stackoverflow.com/a/41000237/1374461 –

+0

Interessant, danke für den Tipp @ Jasper-M – jhegedus

Antwort

1

Sie könnten die folgenden mit Monocle tun:

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) 
} 
+0

Vielen Dank! Sehr interessant ! Funktioniert das, wenn 'cc' ein Untertyp von' CC [E] 'ist? Es scheint so, aber ich bin unsicher. In diesem Fall müsste Monocle auch die Felder des Subtyps kopieren können. Kann Monocle das tun? Wenn zum Beispiel "DD erweitert CC [E]" ein Feld "val d: String" enthält, müsste "f" auch "d" kopieren, aber beim Erzeugen der Linse für "CC [E]" weiß Monocle nicht einmal davon "d". Also frage ich mich, wie das funktionieren kann? – jhegedus

+0

Ja, wenn Sie ein 'Lens [CC [E], Liste [E]]' haben, können Sie es auf einen Wert vom Typ 'DD extends CC [E]' verwenden. Allerdings können Sie '@ Objektive' nicht verwenden, um ein solches 'Objektiv' zu erzeugen, da es nur für Fallklassen funktioniert und Sie diese nicht erweitern können. –