Der Standard makeLenses
Implementierung generiert Linsen für alle Felder eines Datensatzes, die mit Unterstrich beginnen. Ich mag die Idee, aus vielen Gründen eine so unangenehme Benennungskonvention in meine Aufzeichnungen aufnehmen zu müssen, sehr. Ich möchte nur Linsen für alle Felder eines Datensatzes erzeugen und sie benennen, indem ich einfach ein Suffix "L" an die Feldnamen angehängt habe.
Mit einer fc-labels Bibliothek musste ich nur noch
erreichen %Vor%aber die Linse Bibliothek hat eine viel kompliziertere Konfiguration mit Regelsätze und Sachen, die nicht so einfach zu verstehen sind. Also frage ich nach einem bestimmten Rezept, um dasselbe zu erreichen.
Wenn man sich den Code ansieht, scheint das ziemlich einfach zu sein. LensRules
haben eine Funktion lensField :: String -> Maybe String
(die entweder den Namen für ein Objektiv angibt oder fehlschlägt). Sie können also eine Funktion wie
und verwende das anstelle von makeLenses
. Natürlich könnten Sie Ihre Funktion auf (++ "L")
parametrieren.
Oder Sie könnten es inline schreiben, wenn Sie es bevorzugen, z. B.
%Vor% (Beachten Sie, dass (??)
nur infix flip
ist, um die Argumente in der richtigen Reihenfolge zu übergeben. Sie können es sich in diesem Fall als "Loch" vorstellen, in das das zweite Argument eingefügt wird. Und (&)
ist gerade umgedreht ($)
.)
Die Antwort von shachaf funktioniert nicht mit Objektiven 4.4+, die die Template-Haskell-APIs geändert haben.
Hier ist die Implementierung, die mit diesen Versionen funktioniert:
%Vor% (das ist 4.5+, in 4.4 würde das Lambda nur \_ name
als Parameter annehmen)
Tags und Links haskell lens template-haskell lenses