Ich habe folgendes Programm:Wie Wert in einer verschachtelten Karte setzen Objektiv mit
{-# LANGUAGE TemplateHaskell #-}
import qualified Data.Map.Strict as Map
import Control.Lens
data MyLabel = MyLabel { _label :: String } deriving (Show, Eq, Ord)
data MyMap = MyMap { _vals :: Map.Map String MyLabel } deriving (Show, Eq, Ord)
makeLenses ''MyLabel
makeLenses ''MyMap
sample :: MyMap
sample = MyMap { _vals = Map.fromList [("foo", MyLabel "bar")] }
Jetzt würde ich gerne wissen, wie eine Transformation zu tun f
Linsen, so dass:
f sample "quux" == MyMap { _vals = Map.fromList [("foo", MyLabel "quux")] }
ich habe gelernt, dass die Funktion at
von Lens-Bibliothek verwendet werden soll, Karten zu ändern, so dass ich versuchte, solche Dinge zu tun:
sample ^. vals & at "foo" . label .~ Just "quux"
Aber das erzeugt eine Fehlermeldung, die für mich nicht sehr verständlich ist. Was ist der richtige Weg?
Gibt es einen Grund, warum Sie 'data' anstelle von' newtype' dafür verwenden? – dfeuer
Ja, zur besseren Lesbarkeit wurde es aus einem größeren Codecode extrahiert, in dem ich mehr Felder verwende. – user1747134