Ich verwende das implizite Def, um einen rekursiven HList
-Typ zu erstellen, um mehrere Arten von höher bewerteten Typen von HList
zu erreichen. Ich bin stark inspiriert von diesem Beitrag .
Dieser Code funktioniert perfekt:
%Vor% Nun, ich weiß nicht warum, aber wenn ich versuche, eine ++
Methode für HCons
hinzuzufügen, die einfach die existierende HList.++
Methode aufruft, funktioniert das NICHT:
Ich bekomme diesen Kompilierungsfehler:
%Vor% Da HCons
ein Untertyp von HList
ist, wie der von HList. ++ definierte L1-Typ, dachte ich, es sei OK.
Ich habe das versucht, aber das funktioniert nicht besser:
%Vor%Was habe ich vermisst?
Danke:)
Sie sollten Ihre ++
Methodendefinition von dieser ändern:
dazu:
%Vor%Der Compiler verfügt nicht über genügend Informationen, um den richtigen impliziten Wert innerhalb der Methodendefinition auszuwählen, aber wenn Sie den Appender von außen übergeben, sollte dieses Beispiel bestehen:
%Vor% Update 1: In der Methode ++
auf HCons
rufen wir die Methode HList.++
auf, die einen impliziten Parameter benötigt. Dieser Parameter muss vom Typ Appender[HCons[T, U], L2, HCons[T, U#Plus[L2]]]
sein. Der Compiler könnte diesen impliziten Parameter von HList.consAppender
füllen, aber dies erfordert wiederum einen anderen impliziten Parameter vom Typ Appender[U, L2, U#Plus[L2]]
. Dies ist der Parameter, den der Compiler selbst nicht finden kann . Wenn Sie dies wissen, kann der obige Code wie folgt vereinfacht werden:
Update 2: Der Compiler muss implizite Parameter an der Call-Site eingeben, in unserem Fall in HCons.++
method (kann verifiziert werden, z. B. mit scalac -Xprint:typer
). Es kann unter zwei Appender-Typen auswählen:
Der erste kann nur verwendet werden, wenn der Typparameter U
HNil
ist, der andere nur, wenn U
HCons
ist. Diese Information ist jedoch nicht in HCons.++
verfügbar. Es weiß nur, dass U <: HList
aber nicht weiß, welche Implementierung von HList
es ist und daher fehlschlägt.
Tags und Links scala higher-kinded-types implicit