Wenn man sich the documentation for the Control.Lens module aussehen gibt es ein sehr praktisches Bild von den verschiedenen Teilen des Linse Pakets. Da Sie einen Lens
konstruieren möchten, können Sie den Lens
Teil des Diagramms betrachten. Die oberste gezeigte Funktion ist
lens :: (s -> a) -> (s -> b -> t) -> Lens s t a b
Dies baut ein Objektiv von einem Getter und einem Setter.
Die Funktion s -> a
ist ein Getter - der Typ Unterschrift bedeutet, "Wenn Sie mir eine Datenstruktur s
geben, werde ich einen a
Wert daraus auswählen." Die s -> b -> t
-Funktion ist der Setter, und die Typ-Signatur bedeutet: "Wenn Sie mir einen s
und einen neuen Wert b
geben, erstelle ich für Sie eine neue Struktur t
." (Die Typen sind unterschiedlich, weil Linsen tatsächlich Arten der Dinge ändern können.)
Wenn Ihr Getter tmGet
und Ihre Setter ist tmSet
, Sie also eine Linse mit
tmAt :: Boolean -> Lens s t a b
tmAt b = lens (tmGet b) (tmSet b)
für was auch immer Ihre tatsächliche s
konstruieren kann, t
, a
und b
Parameter sind. Im Beispiel eines Tupels, wäre es
seine
tmAt :: Bool -> Lens (a, a) (a, a) a a
(Mit anderen Worten, wenn Sie dem Objektiv eine Funktion a -> a
geben, kann es ein (a, a)
tupel in einer anderen (a, a)
tupel verwandeln.)
Wenn Sie Lust sein wollen, können Sie auch als
tmAt = lens <$> tmGet <*> tmSet
Ha, das Applicative Form schön umschreiben kann, ist –