Generieren von Linsen für eine "Linsen" -Bibliothek mit einem benutzerdefinierten Namensprozessor anstelle des standardmäßigen "Unterstrichs"

8

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.

    
Nikita Volkov 16.06.2013, 10:49
quelle

2 Antworten

15

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

erstellen %Vor%

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 ($) .)

    
shachaf 16.06.2013, 11:10
quelle
18

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)

    
Emmanuel Touzery 25.10.2014 14:05
quelle