Non riesco a utilizzare la libreria lens
per un problema particolare. Sto cercando di passareUtilizzo di un obiettivo due volte
- una struttura di dati aggiornati
- una lente concentrata sulla parte di quella struttura aggiornata
a un'altra funzione, g
. Passo sia la lente che la struttura dati perché lo g
ha bisogno di alcune informazioni condivise dalla struttura dati e un'informazione. (Se aiuta, la struttura dati contiene informazioni su una distribuzione di probabilità congiunta, ma lo g
funziona solo marginalmente e ha bisogno di sapere quale marginale sto guardando. L'unica differenza tra i due marginali è la loro media con il resto della loro definizione condivisa nella struttura dei dati).
Il mio primo tentativo si presentava così
f :: Functor f => Params -> ((Double -> f Double) -> Params -> f Params) -> a
f p l = g (l %~ upd $ p) l
where upd = ...
g p x = go p p^.x
ma che non riesce durante la compilazione perché f
ottiene dedurre come Identity
per l'aggiornamento e Const Double
per il getter.
Qual è il modo migliore per realizzare ciò che voglio fare? Posso immaginare di essere in grado di fare una delle seguenti operazioni:
- eseguire una copia della lente in modo che il tipo di inferenza può essere diverso in ciascun caso
- anziché passare la struttura aggiornata e la lente, passo la struttura originale e una lente che restituisce un valore modificato (se voglio solo aggiornare la parte della struttura che la lente guarda).
- fare una scelta migliore progettazione per la mia struttura di funzioni/dati
- qualcosa di completamente diverso
Grazie per qualsiasi aiuto!