Methoden zum Ausführen von Werten in Scala anhebend

8

Bietet die Scala-Bibliothek Unterstützung für das Anheben einer Methode eines bestimmten Typs auf einen Funktionswert?

Angenommen, ich möchte String.length anheben. Ich kann schreiben

%Vor%

oder

%Vor%

Diese Syntax ist jedoch nicht immer ideal (besonders in der Mitte eines größeren Ausdrucks). Ich denke, ich suche nach etwas, das Ausdrücke wie

ermöglichen wird %Vor%

und ich habe etwas im Sinn:

%Vor%

Frage 1: Bietet die Standardbibliothek (oder eine Bibliothek) so etwas?

Frage 2: Wenn nicht, ist es möglich, es so zu schreiben, dass Option.filter wie oben aufgehoben werden kann (anstatt als Lift[Option[Int]].lift[Int => Boolean, Option[Int]](_.filter) ) ? Ohne die Typparameter der Methode lift zu erhalten, erhalte ich folgende Fehlermeldung:

%Vor%

Aktualisieren :

Offensichtlich hat das Problem, mit dem ich gerade arbeite, etwas mit der überladenen Methode lift zu tun. Wenn ich die Überladungen umbenenne, kann I Option.filter ohne alle zusätzlichen Typparameter anheben.

    
Aaron Novstrup 11.11.2010, 23:20
quelle

3 Antworten

7

Ich habe endlich eine Lösung gefunden, mit der ich zufrieden bin. Diese Version unterstützt eine einfache Syntax und einen einzigen Zugangspunkt zur API, während sie auch die Form der aufgehobenen Funktion steuert (d. H. Nicht gerade, teilweise curiert oder vollständig curiert).

Beispiele :

Ich werde die folgende Klassendefinition in den folgenden Beispielen verwenden:

%Vor%

Die einfachste Form des Liftings besteht darin, die Methode als eine partiell angewendete Funktion zurückzugeben, die dem Aufruf von ((_: Foo).method _) entspricht:

%Vor%

Indem man einige implicits importiert, kann man curried oder uncurried Formen verlangen:

%Vor%

Implementierung:

%Vor%

Meine vorherige Lösung erforderte für jede Arity eine separate Lift-Methode:

%Vor%

Implementierung:

%Vor%     
Aaron Novstrup 12.11.2010, 21:00
quelle
7

Was ist das Problem mit

? %Vor%

?

    
Daniel C. Sobral 12.11.2010 10:17
quelle
4

Das Übergeben des Filters als teilweise angewendete Methode scheint den Job zu erledigen:

%Vor%     
michid 12.11.2010 09:51
quelle

Tags und Links