Un recent question mi ha portato a chiedersi come convertire unCome posso spingere il polimorfismo in una struttura dati?
forall f . Functor f => [LensLike f s t a b]
in un
[ReifiedLens s t a b]
C'è un modo semplice per farlo molto lentamente, indicizzando nella lista con !!
, ma è abbastanza incredibilmente inefficiente. Sembra che ci dovrebbe essere abbastanza parametrricità per tirare un trucco simile a quello utilizzato in reflection
, ma non riesco a capire nulla. È possibile farlo in modo efficiente?
Non penso che sia nemmeno possibile. Dovremmo andare (operativamente) da 'Functor f -> [LensLike f s t a b]' a '[Functor f -> LensLike f s t a b]'. Dobbiamo passare in un 'Functor f' per estrarre una lista per cominciare, e non ce n'è una in giro. –
@ AndrásKovács Forse possiamo usare un argomento parametrico per convincerci che le funzioni di tipo 'Functor f -> [LensLike f s t a b]' devono scegliere la lunghezza della loro lista di risultati senza esaminare l'argomento 'Functor f' in modo significativo. Quindi è facile ottenere il resto della strada da lì. (Naturalmente questa affermazione chiaramente non è vera per le funzioni di tipo 'Functor F -> [LensLike F s t a b]' per alcuni particolari 'F'.) –
@ AndrásKovacs, questa era la mia paura. Avremmo bisogno di una sorta di dizionario "superfunzionatore" che potremmo trasmettere e che sarebbe magicamente in grado di assumere l'identità di qualsiasi altro dizionario di 'Functor'. – dfeuer