Mam kilka typów danych wzdłuż liniiJak mogę użyć Control.Lens do aktualizacji i-tego elementu listy?
data Outer = Outer { _list :: [ Inner ] }
data Inner = Inner { _bool :: Bool }
pomocą Control.Lens mogę uzyskać dostęp do _bool z ith wewnętrzna (wewnątrz monady 'państwo Outer') jak to
boolValue <- gets (^. list . to (!! i) . inner)
I chciałby być także w stanie zaktualizować tę wartość z czymś jak
list ^. (to (!! i)) ^. inner %= True
jednak (wg mojego zrozumienia), funkcja „na” tworzy tylko getter, a nie prawdziwy len s może być używany jako getter lub seter.
Jak więc przekonwertować (!! i) na obiektyw, który pozwoli mi zaktualizować to pole?
czy mógłbyś wyjaśnić jaka jest różnica między 'ix' a' elementem'? Poszedłem z "elementem" Gabriela, ponieważ wydaje się prostsze, biorąc "Int" zamiast "Index". Z dokumentów, które łączyłeś, wydaje się, że "ix" jest bardziej ogólny w tym, na co pozwala - czy jest on bardziej ogólny? – ajp
Nie myślałem o "elemencie". Nie jest tak, że jeden jest bardziej ogólny niż drugi ... 'ix' jest typem klasy, który ma kilka instancji do indeksowania z konkretnymi typami indeksów (na przykład listy z' Int', 'Map's with ich typ indeksu, funkcjonuje w ich domenie). 'element' pobiera dowolny typ" Traversable "i zlicza od lewej do prawej z indeksem' Int'. W tym przypadku spotykają się ze sobą. – shachaf
Nie testowałem tego, ale przypuszczam, że 'ix' jest nieco bardziej wydajny w tym konkretnym przypadku (głównie dlatego, że nie wymyśliłem sposobu, aby' Indexing' wygenerował dobry kod ... :-(Ktoś inny jest mile widziany, aby spróbować) .Jest to również nieco klasy ad-hoc. – shachaf