Mam problem z używaniem biblioteki lens
dla konkretnego problemu. Próbuję przekazaćUżywanie soczewki dwa razy
- uaktualniony struktura danych
- obiektyw koncentruje się na części tej zaktualizowanej struktury
do innej funkcji, g
. Przesyłam zarówno obiektyw, jak i strukturę danych, ponieważ g
potrzebuje pewnych wspólnych informacji ze struktury danych, a także z informacji. (Jeśli to pomaga, struktura danych zawiera informacje o wspólnym rozkładzie prawdopodobieństwa, ale g
działa tylko na marginesie i musi wiedzieć, na którym marginalnie patrzę.Jednaką różnicą między tymi dwoma marginesami jest ich średnia z resztą ich definicja jest współużytkowana w strukturze danych).
Moja pierwsza próba wyglądało to
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
ale to zawiedzie podczas kompilacji, ponieważ f
dostaje wywnioskować jako Identity
dla aktualizacji i Const Double
dla getter.
Jaki jest najlepszy sposób na osiągnięcie tego, co chcę zrobić? Mogę sobie wyobrazić, jest w stanie wykonać jedną z następujących czynności:
- zrobić kopię obiektywu tak, że typ wnioskowanie może być różny w każdym przypadku
- zamiast przechodząc zaktualizowaną strukturę i obiektyw, mijam oryginalna struktura i soczewka, która zwraca zmodyfikowaną wartość (jeśli chcę tylko zaktualizować część struktury, na którą patrzy obiektyw).
- czyni lepszym wyborem dla mojego projektu konstrukcji funkcje/dane
- coś zupełnie innego
Dzięki za pomoc!