Generische Typparameter höherer Ordnung (oder rekursiv?) in Kotlin

8

Ich entwickle einen sehr deklarativen Code, und die Art der Schlussfolgerungen und Sicherheit, die mit Kotlin einhergehen, helfen sehr. Eines der Ziele besteht darin, Erweiterungen (Unterklassen) der primären Typen dummerweise einfach zu implementieren. Um Rich Inference und Ausdruckskraft zu erhalten, habe ich einige Erfolge bei der Definition von generischen Erweiterungsfunktionen gefunden, die auf Unterklassen projiziert werden. Alle Typinformationen von Unterklassenmethoden ohne die zusätzliche Implementierung der Unterklasse, es ist großartig.

Ich versuche also, eine umfassende generische Funktion zu schreiben, die so viele Typinformationen wie möglich enthält. Das Problem schleicht sich mit der Tatsache, dass diese Funktion auf potenziell rekursiv generischen Typen arbeitet, und ich möchte die generischen Typparameter mischen.

Dies wäre ohne ein Beispiel unmöglich zu beschreiben. So in Betracht ziehen:

%Vor%

Wir wollen eine Funktion, die dies effektiv ermöglicht, außer generisch

%Vor%

Zielkriterien:

  • Nimmt C als Parameter und gibt C zurück, außer mit einem anderen generischen Typparameter
  • Ich möchte dieses Verhalten als eine Erweiterungsfunktion aller Unterklassen von G verallgemeinern
    • Es muss eine Erweiterungsfunktion sein, damit wir bei generischen Typen den Typ der Unterklasse verwenden können und sicherstellen, dass das Argument ein generisches Argument vom Typ receiver hat.
    • Oder, mit anderen Worten, wir wollen eine Erweiterungsfunktion für Unterklassen von G , so dass das Argument C<B<*>> anstelle von C<G<*>> sein muss, wenn es auf B<A<*>>
    • aufgerufen wird

Das beschreibt den Kern des Problems. Ich bin mir nicht sicher, ob die Sprache in der Lage ist zu unterstützen, was ich will. Ich bin mir nicht sicher, ob die Art der Löschung ein Faktor ist, der dies unmöglich macht, aber bis jetzt kann ich es nicht finden (vielleicht könnte ich Hilfe gebrauchen, wenn es so ist).

Folgendes ist nahe

%Vor%

aber es gibt ein paar Probleme

  • Es gibt G<A<*>> anstelle von C<A<*>> zurück. Es wäre schön, wenn es C zurückgeben und keine Typinformationen verlieren könnte (sonst habe ich sowieso keine Verwendung für diese Funktion)
  • Es gibt technisch keine Garantie ReceiverType ist Arg1Type

Wenn ich vorausschaue, wenn etwas wie das Folgende gültig wäre, würde ich mein Problem ansprechen.

%Vor%

Gibt es einen Grund, warum das nicht möglich ist? z.B. als Feature in der Sprache hinzugefügt? Ich habe logistische Gründe dagegen, aber ich bin gespannt, ob das prinzipiell auch möglich ist.

Letzte Anmerkungen:

  • Es erinnert mich an Typ-Aliase mit Ausnahme von generischen Typparametern. In der Tat habe ich dieses Schlüsselwort in das Beispiel aufgenommen, falls es hilft zu verdauen. Das ist jedoch nicht der einzige Teil, beachte <T> und <U> in der Syntax.
  • Es erinnert mich fast auch an Monaden, außer an den Klassendefinitionen selbst, wenn das auf eine Art von handgewelltem, intuitivem Weg sinnvoll ist.
  • Ich habe noch keine Idee, wie ich den Körper implementieren soll, aber ich bin nicht so weit gekommen, da ich immer noch versuche zu sehen, ob die Unterschrift überhaupt möglich ist: p
World Outsider 07.06.2017, 09:26
quelle

1 Antwort

0

Letztendlich habe ich nach höheren Arten gesucht. Ich habe versucht, alles in einen einzigen übermäßig verschachtelten Typkonstruktor zu zwingen. Die Manipulationen, die ich erreichen wollte, können auf diese Weise nicht erreicht werden und müssen mit mehreren Typparametern durchgeführt werden. Die funktionale Bibliothek Arrows Beschreibung höherer Arten hat mir geholfen, dies zu erkennen.

  

In einer höheren Klasse mit der Form Kind<F, A> , wenn A der Typ des Inhalts ist, muss F der Typ des Containers sein.

     

Eine fehlerhafte höhere Klasse würde den gesamten Typkonstruktor verwenden, um den Container zu definieren und den Typ des Inhalts Kind<Option<A>, A> zu duplizieren. Diese falsche Darstellung hat eine große Anzahl von Problemen, wenn mit teilweise angewendeten Typen und verschachtelten Typen gearbeitet wird.

    
World Outsider 14.02.2018, 06:12
quelle