Scala höher kidded Typen im impliziten Def schlägt mit "konnte keinen impliziten Wert finden"

8

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:

%Vor%

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:)

    
Loic 29.04.2016, 18:46
quelle

1 Antwort

10

Sie sollten Ihre ++ Methodendefinition von dieser ändern:

%Vor%

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:

%Vor%

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:

%Vor%

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.

    
Mifeet 02.05.2016, 11:06
quelle