Ich habe einige Datentypen entlang der Linie derWie kann ich mit Control.Lens das i-te Element einer Liste aktualisieren?
data Outer = Outer { _list :: [ Inner ] }
data Inner = Inner { _bool :: Bool }
Control.Lens verwendet wird, kann ich die _Bool des i-ten Inner Zugang (innen eine Monade 'Staat Outer') wie dieses
boolValue <- gets (^. list . to (!! i) . inner)
I möchte auch wie diesen Wert mit etwas zu aktualisieren, in der Lage
list ^. (to (!! i)) ^. inner %= True
jedoch (nach meinem Verständnis), die ‚in‘ Funktion erzeugt nur einen Getter, kein echter len s, das entweder als Getter oder Setter verwendet werden kann.
Also, wie kann ich (!! i) in ein Objektiv konvertieren, mit dem ich dieses Feld aktualisieren kann?
könnten Sie klären, was der Unterschied zwischen 'ix' und' element' ist? Ich bin mit Gabriels "Element" gegangen, da es einfacher scheint, einen "Int" anstelle eines "Index" zu nehmen. Aus den Dokumenten, die Sie verlinkt haben, scheint 'ix' allgemeiner zu sein, was es erlaubt - ist es strikt allgemein? – ajp
Ich dachte nicht an "Element". Es ist nicht genau, dass einer allgemeiner ist als der andere ... 'ix' ist eine Typklasse, die eine Reihe von Instanzen zur Indizierung mit bestimmten Indextypen hat (zum Beispiel Listen mit' Int', 'Map's mit ihr Indextyp funktioniert mit ihrer Domäne). 'element' nimmt einen' Traversable' Typ und zählt von links nach rechts mit einem 'Int' Index. In diesem Fall passieren sie zufällig. – shachaf
Ich habe es nicht getestet, aber ich würde annehmen, dass 'ix' in diesem speziellen Fall ein wenig effizienter ist (hauptsächlich, weil ich keinen Weg gefunden habe,' Indizierung' zu einem guten Code zu machen ... :-(Jemand anderes ist willkommen zu versuchen.) Es ist auch eine etwas ad-hoc-Klasse. – shachaf