Ich bin kürzlich auf ein Problem gestoßen. Ich versuche, "tail-nested" Tupel auf eine Compiler-freundliche Weise zu verflachen, und ich habe den folgenden Code entwickelt:
%Vor%Dieser obige Code eignet sich gut zum Reduzieren von Tupeln, die ich "tail-nested" wie die unten genannten nenne.
%Vor%Ich versuche jedoch, meine Lösung robuster zu machen. Stellen Sie sich einen Fall vor, in dem ich eine Liste dieser höher-kinded "tail-nested" Tupel habe.
%Vor% Die abgeleitete Typ-Signatur davon wäre List[(Int, Any)]
und dies stellt ein Problem für eine Operation wie map
dar, die mit folgendem Fehler fehlschlagen würde:
error: No implicit view available from Any => List[Int]
Dieser Fehler ergibt sich für mich aufgrund der Natur meiner rekursiven impliziten Kette in der flatten Funktion. Ich frage mich jedoch: Gibt es irgendeine Möglichkeit, wie ich meine Methode der Verflachung der Tupel robuster machen kann, so dass Funktionen höherer Ordnung wie map
gut damit kämmen?
BEARBEITEN:
Wie Bask.ws betont hat, bietet das Produktmerkmal Potential für eine nette Lösung. Der folgende Code veranschaulicht dies:
%Vor%Der Ergebnistyp dieses neuen abgeflachten Aufrufs ist immer Liste [Beliebig]. Mein Problem wäre gelöst, wenn es einen Weg gäbe, den Compiler diese Grenze ein wenig zu straffen. Kann jemand parallel zu meiner ursprünglichen Frage wissen, ob es möglich ist, dies zu erreichen?
UPD Kompilierzeit-Fail-Lösung hinzugefügt
Ich habe eine Lösung, die Ihnen passt. Die Typen der ersten 3 Beispiele werden in der Kompilierzeit aufgelöst: Int, Tuple2 [Int, Int], Tuple2 [Int, Tuple2 [Int, Int]]. Für Ihr Beispiel mit der Liste haben Sie eine heterogene Liste mit dem tatsächlichen Typ List [(Int, Any)] und Sie müssen den zweiten Typ in Runtime auflösen oder es kann vielleicht durch Makro erfolgen. Vielleicht möchten Sie also tatsächlich implicit def flatten[T](x: (T,Any))
schreiben, da Ihr Fehler Sie darauf hinweist.
Hier ist die schnelle Lösung. Es gibt ein paar Warnungen, aber es funktioniert gut:
%Vor%UPD Ich habe das Problem ein wenig mehr recherchiert, und ich habe eine einfache Lösung gefunden, um eine homogene Liste zu erstellen, die zur Kompilierzeit fehlschlagen kann. Es wird vollständig ohne Any eingegeben und passt und sieht so aus, als ob der Compiler die verschachtelten implicits jetzt korrekt löst.
%Vor%Dann können Sie jede gewünschte Abflachung implementieren. Zum Beispiel eins oben:
%Vor%Tags und Links scala tuples higher-kinded-types