Sammeln Sie Argumente, die auf Curry-Funktionen in Java / Scala angewendet werden sollen

9

Ich möchte eine Klasse in Java 8 erstellen, die in der Lage ist, rekursiv ein Objekt zu erstellen, das eine Methode hat, die einen Funktionsparameter basierend auf den hinzugefügten Parametern übernimmt.

Ich möchte zum Beispiel folgendes tun können:

%Vor%

Die apply-Methode würde dann die gesammelten Parameter auf die gegebene Funktion anwenden.

Ich denke, das sollte ohne Nachdenken möglich sein, während man die Typensicherheit behält, aber ich kann nicht genau herausfinden, wie. Eine Lösung in Scala ist ebenfalls willkommen, wenn ich sie in Java 8 übersetzen kann. Wenn es nicht möglich ist, werde ich auch eine Antwort akzeptieren, die erklärt, warum.

Was ich bisher habe, ist im Wesentlichen folgendes:

%Vor%

Wie in den Code-Kommentaren erwähnt, sind meine Probleme die Funktionsparameter in der Reihenfolge der Aufrufe von param () zu halten und die Parameter tatsächlich anzuwenden.

    
Justin Kaeser 21.04.2014, 09:24
quelle

3 Antworten

2

Für eine unbegrenzte Anzahl von Parametern ist die einzige Lösung, die ich mir vorstellen kann, Heterogene Listen in Scala.

Es ist wahrscheinlich in Java nicht machbar, da bei Pfad-abhängigen Typen eine Typ-Level-Berechnung stattfindet.

Verwendung von heterogenen Listen und pfadabhängigen Typen:

%Vor%

Dieser Code wird gedruckt:

%Vor%

Der zweite, etwas eingeschränktere Weg, dies zu tun, der aber mit Java funktionieren könnte, besteht darin, mehrere Klassen für jede Funktionslänge zu erstellen, die die nächstgrößere Funktionslängenklasse zurückgeben und den Wert bis zu einer maximalen Länge umschließen Applicative Builder in Scalaz: "Scalaz Applicative Builder"

    
NightRa 21.04.2014, 18:56
quelle
1

Dies beantwortet Ihre Frage nicht. Aber vielleicht hilft es jemandem, eine Lösung zu finden oder zu erklären, warum es in Java und / oder Scala nicht möglich ist.

Es kann in C ++ mit einer beliebigen Anzahl von Parametern gemacht werden, ohne die Typsicherheit zu verlieren. Die Anrufseite sieht folgendermaßen aus. Leider ist die Lambda-Syntax in C ++ ziemlich ausführlich.

%Vor%

Nachstehend folgt die Definition von foo und bar . Die Implementierung ist unkompliziert. Ich bezweifle jedoch, dass es möglich ist, in Java so etwas zu erstellen, weil die Typ-Typ-Parameter in Java funktionieren. Generics in Java können nur benutzt werden, um type casts zu vermeiden, und das ist nicht genug für diesen Anwendungsfall.

%Vor%     
nosid 21.04.2014 13:10
quelle
1

Entschuldigung, ich könnte nur einige Hinweise in Scala geben:

Vielleicht würde es helfen, sich Ссылка $ anzuschauen

%Vor%

sieht ziemlich genau wie Function.uncurried

aus %Vor%

könnte unter Verwendung einer Liste für einen Akkumulator implementiert werden, wenn Sie nicht nach Typsicherheit suchen. Wenn Sie die Typen beibehalten möchten, können Sie den HList aus Ссылка verwenden, der mit einem handlichen Tupel Methode.

Implementierung von param ():

%Vor%

Beispiel

%Vor%     
Andreas Neumann 21.04.2014 18:23
quelle

Tags und Links