2015-03-19 19 views
5

stavo leggendo currying in funzionali-programmazione, e ho una domanda molto semplice:funzionale programmazione Principiante: currying in Java

Se ho due funzioni in Java

int add(int x, int y){ 
    return x+y; 
} 

e creare un altro metodo

int increment(int y){ 
     return add(1, y); 
    } 

Nel codice di cui sopra, quando ho scritto increment funzione, ho davvero curry add?

+0

Non avevo idea di cosa fosse il currying, quindi ho dovuto cercarlo. Ho pensato di condividere l'articolo di Wikipedia su [Currying] (http://en.wikipedia.org/wiki/Currying) – Ascalonian

+0

Post correlati: [java supporta Currying?] (Http://stackoverflow.com/questions/6134278/ does-java-support-currying) – Ascalonian

risposta

6

Hai applicato parzialmente add. Questo è legato al curry.

In alcune lingue che supportano l'applicazione parziale, le funzioni vengono elaborate per impostazione predefinita. potresti scrivere codice come:

increment = add(1) 
println(increment(2)) 
# => 3 

Una funzione al curry consente di applicare parzialmente tale funzione direttamente. Java non supporta questo tipo di cose senza macchinari aggiuntivi.

EDIT:

In Java 8, con lambda e java.util.function, è possibile definire una funzione curry.

import java.util.function.Function; 

public class Example { 
    public static <T, U, R> Function<T, Function<U, R>> curry(BiFunction<T, U, R> f) { 
     return t -> u -> f.apply(t, u); 
    } 

    public static int add(int x, int y) { 
     return x + y; 
    } 

    public static void main(String[] args) { 
     Function<Integer, Function<Integer, Integer>> curriedAdd = curry(Example::add); 
     // or 
     // BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y; 
     // curriedAdd = curry(add); 

     Function<Integer, Integer> increment = curriedAdd.apply(1); 
     System.out.println(increment.apply(4)); 
    } 
} 

EDIT # 2: mi sbagliavo! Ho corretto/modificato la mia risposta. Come sottolineato da Sepp2k, questa è solo un'applicazione di funzione parziale. I due concetti sono correlati e spesso confusi. A mia difesa c'è una sezione sulla pagina di Wikipedia in corso sul mixup.

+1

'incrementare' non è il risultato di" aggiungere "- è il risultato dell'applicazione parziale di' add'. Il risultato dell'espressione 'add' sarebbe una funzione che può essere chiamata' curriedAdd (arg1) (arg2) '. – sepp2k

+1

[Flex your PECS] (http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs)! Per la massima flessibilità, il parametro del metodo 'curry' dovrebbe invece essere dichiarato come' BiFunction '. – Jubobs

0

No, basta chiamarlo. È necessario passare la funzione come argomento e restituire una valutazione parziale di tale funzione per chiamarla in corso di elaborazione.

Problemi correlati