Je me demandais s'il y avait un moyen de tirer cela en Java. Je pense que ce n'est pas possible sans un support natif des fermetures.
java
functional-programming
currying
partial-application
utilisateur855
la source
la source
Réponses:
Java 8 (sorti le 18 mars 2014) prend en charge le curry. L'exemple de code Java publié dans la réponse par missingfaktor peut être réécrit comme suit :
... ce qui est plutôt sympa. Personnellement, avec Java 8 disponible, je vois peu de raisons d'utiliser un autre langage JVM tel que Scala ou Clojure. Ils fournissent d'autres fonctionnalités de langage, bien sûr, mais cela ne suffit pas pour justifier le coût de transition et le support IDE / outillage / bibliothèques plus faible, IMO.
la source
(def adder5 (partial + 5)) (prn (adder5 4)) (prn adder5 6)
Le curry et l'application partielle sont tout à fait possibles en Java, mais la quantité de code requise vous désactivera probablement.
Un peu de code pour illustrer le curry et l'application partielle en Java:
FWIW voici l'équivalent Haskell du code Java ci-dessus:
la source
Il existe de nombreuses options pour Currying avec Java 8. Type de fonction Javaslang et jOOλ offrant tous deux Currying prêt à l'emploi (je pense que c'était un oubli dans le JDK), et le module Cyclops Functions a un ensemble de méthodes statiques pour Currying JDK Functions et références de méthode. Par exemple
«Currying» est également disponible pour les consommateurs. Par exemple, pour renvoyer une méthode avec 3 paramètres, et 2 de ceux déjà appliqués, nous faisons quelque chose de similaire à ceci
Javadoc
la source
currying
dans leCurry.curryn
code source.EDIT : Depuis 2014 et Java 8, la programmation fonctionnelle en Java est désormais non seulement possible, mais pas non plus laide (j'ose dire beau). Voir par exemple la réponse de Rogerio .
Ancienne réponse:
Java n'est pas le meilleur choix si vous allez utiliser des techniques de programmation fonctionnelle. Comme l'a écrit missingfaktor, vous devrez écrire une assez grande quantité de code pour obtenir ce que vous voulez.
D'autre part, vous n'êtes pas limité à Java sur JVM - vous pouvez utiliser Scala ou Clojure qui sont des langages fonctionnels (Scala est, en fait, à la fois fonctionnel et OO).
la source
Le curry nécessite de retourner une fonction . Ce n'est pas possible avec java (pas de pointeurs de fonction) mais nous pouvons définir et renvoyer un type qui contient une méthode de fonction:
Maintenant curry une division simple. Nous avons besoin d'un diviseur :
et une fonction de division :
Maintenant, nous pouvons faire une division curry:
la source
Eh bien, Scala , Clojure ou Haskell (ou tout autre langage de programmation fonctionnel ...) sont définitivement LES langages à utiliser pour le curry et autres astuces fonctionnelles.
Cela dit, il est certainement possible de curry avec Java sans les super quantités de passe-partout à laquelle on pourrait s'attendre (enfin, devoir être explicite sur les types fait beaucoup mal - jetez simplement un coup d'œil à l'
curried
exemple ;-)).Les tests ci-dessous présentent les deux, en curry un
Function3
enFunction1 => Function1 => Function1
:ainsi qu'une application partielle , bien que ce ne soit pas vraiment sécurisé dans cet exemple:
Ceci est tiré d'un Proof Of Concept que je viens d'implémenter pour le plaisir avant JavaOne demain dans une heure "parce que je m'ennuyais" ;-) Le code est disponible ici: https://github.com/ktoso/jcurry
L'idée générale pourrait être étendue à FunctionN => FunctionM, relativement facilement, bien que la "sécurité de type réel" reste un problème pour l'exemple d'application partia et que l'exemple de curry aurait besoin de beaucoup de code standard dans jcurry , mais c'est faisable.
Dans l'ensemble, c'est faisable, mais dans Scala, c'est hors de la boîte ;-)
la source
On peut émuler le curry avec Java 7 MethodHandles: http://www.tutorials.de/threads/java-7-currying-mit-methodhandles.392397/
la source
Oui, voyez l'exemple de code par vous-même:
Ceci est un exemple simple avec curriedAdd étant une fonction curry qui renvoie une autre fonction, et cela peut être utilisé pour une application partielle des paramètres tels que stockés dans curried qui est une fonction en soi. Ceci est maintenant appliqué plus tard complètement lorsque nous l'imprimons à l'écran.
De plus, plus tard, vous pouvez voir comment vous pouvez l'utiliser dans le style JS comme
la source
Encore une fois sur les possibilités de Java 8:
Vous pouvez également définir des méthodes utilitaires comme celle-ci:
Ce qui vous donne une syntaxe sans doute plus lisible:
la source
Currying une méthode est toujours possible en Java, mais il ne la prend pas en charge de manière standard. Essayer d'y parvenir est compliqué et rend le code assez illisible. Java n'est pas le langage approprié pour cela.
la source
Un autre choix est ici pour Java 6+
alors vous pourriez réaliser le curry de cette façon
la source
Bien que vous puissiez faire du curry en Java, c'est moche (car ce n'est pas pris en charge). En Java, il est plus simple et plus rapide d'utiliser des boucles simples et des expressions simples. Si vous publiez un exemple d'utilisation du curry, nous pouvons vous suggérer des alternatives qui font la même chose.
la source
2 * ?
En Java, vous le feriez avec une boucle.Il s'agit d'une bibliothèque de currying et d'application partielle en Java:
https://github.com/Ahmed-Adel-Ismail/J-Curry
Il prend également en charge la déstructuration des tuples et Map.Entry dans les paramètres de méthode, comme par exemple en passant un Map.Entry à une méthode qui prend 2 paramètres, donc Entry.getKey () ira au premier paramètre, et Entry.getValue () ira pour le deuxième paramètre
Plus de détails dans le fichier README
la source
L'avantage d'utiliser Currying dans Java 8 est qu'il vous permet de définir des fonctions d'ordre supérieur, puis de transmettre une fonction de premier ordre et des arguments de fonction d'une manière enchaînée et élégante.
Voici un exemple pour Calculus, la fonction dérivée.
la source
Oui, je suis d'accord avec @ Jérôme, le traitement en Java 8 n'est pas supporté de manière standard comme dans Scala ou d'autres langages de programmation fonctionnelle.
la source