Formlos: Generisches Objektiv, das nach Fallklasse oder Feld parametrisiert ist

8

Basiert auf:

%Vor%

Ich versuche, eine Methode zur Linsenherstellung zu entwickeln, etwas:

%Vor%

Aber es scheint nicht offensichtlich. Ist es möglich zu tun?

Wenn nicht, ist das Endergebnis, das ich zu erreichen versuche, eine generische Methode zum Aktualisieren von verschachtelten Maps mit Inhalten der Fallklasse, z. B .:

%Vor%

Ich kann es nicht zur Arbeit bringen, wenn es durch T und f parametrisiert wird. Gibt es noch andere idiomatische Lösungen, die keine Kochplatten sind?

Danke!

    
ponythewhite 30.07.2014, 14:37
quelle

1 Antwort

9

Das Problem mit Ihrem makeLens ist, dass wir z. makeLens[Content]('foo) schlägt bei der Kompilierung fehl und dies ist mit einem normalen Symbol Argument nicht möglich. Sie benötigen einige zusätzliche implizite Argumente, um den Singletontyp für den angegebenen Namen nachzuverfolgen und nachzuweisen, dass es sich um den Namen eines Members der Fallklasse handelt:

%Vor%

Und dann:

%Vor%

Aber makeLens[Content]('foo) wird nicht kompiliert (was wir wollen).

Sie benötigen die gleiche Art von Tracking für Ihre nestedMapLens :

%Vor%

Beachten Sie, dass ich eine build.sbt wie folgt annehmen kann:

%Vor%

Definieren wir nun eine Beispielkarte und einige Linsen:

%Vor%

Und dann:

%Vor%

Dies ist ungefähr so ​​"boilerplate-free" wie Sie bekommen werden. Die unordentlichen impliziten Argumentlisten sind zunächst einschüchternd, aber man gewöhnt sich ziemlich schnell an sie, und ihre Rolle beim Zusammenführen verschiedener Beweisstücke über die Typen, mit denen man arbeitet, wird nach ein wenig Übung ziemlich intuitiv.

    
Travis Brown 04.10.2014, 00:34
quelle

Tags und Links