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.
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
Post correlati: [java supporta Currying?] (Http://stackoverflow.com/questions/6134278/ does-java-support-currying) – Ascalonian