A recent question führte mich wie zu fragen, einWie kann ich Polymorphismus in eine Datenstruktur pushen?
forall f . Functor f => [LensLike f s t a b]
in ein mit !!
,
[ReifiedLens s t a b]
Es gibt einen einfachen Weg, um es wirklich langsam durch die Indizierung in die Liste zu tun, um zu konvertieren, aber es ist ziemlich unglaublich ineffizient. Es fühlt sich so an, als ob es genug Parameter geben sollte, um einen ähnlichen Trick auszuführen wie in reflection
, aber ich kann nichts herausfinden. Ist es überhaupt möglich, dies effizient zu tun?
Ich glaube nicht, dass das überhaupt möglich ist. Wir müssten (operativ) von 'Functor f -> [LensLike fs t a b]' zu '[Functor f -> LensLike fs t a b]' gehen. Wir müssen einen 'Functor f' übergeben, um zunächst eine Liste zu erstellen, und es gibt keine. –
@ AndrásKovács Vielleicht können wir ein parametrisches Argument verwenden, um uns davon zu überzeugen, dass Funktionen vom Typ 'Functor f -> [LensLike f s t a b]' die Länge ihrer Ergebnisliste wählen müssen, ohne das 'Functor f'-Argument in sinnvoller Weise zu untersuchen. Dann ist es einfach, den Rest des Weges von dort zu bekommen. (Natürlich trifft diese Behauptung natürlich nicht auf Funktionen des Typs 'Functor F -> [LensLike F s t a b]' für ein bestimmtes 'F' zu.) –
@ AndrásKovacs, das war meine Angst. Wir brauchten eine Art "Superfactor" -Wörterbuch, das wir weitergeben konnten und das magisch in der Lage sein würde, die Identität eines anderen 'Functor'-Wörterbuchs anzunehmen. – dfeuer