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
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:
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.
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:
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%Tags und Links scala