2015-03-19 4 views
5

czytałem o currying w funkcjonalnych programowania i mam bardzo podstawowe pytanie:Functional Programming Początkujący: currying w Javie

Jeśli mam dwie funkcje w Javie

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

i tworzę kolejny metoda

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

W powyższym kodzie, gdy pisałem increment funkcję, ja faktycznie curry add?

+0

Nie miałem pojęcia, czym jest curry, więc musiałem to sprawdzić. Pomyślałem, że podzielę się artykułem z Wikipedii na temat [Currying] (http://en.wikipedia.org/wiki/Currying) – Ascalonian

+0

Podobne posty: [Czy obsługa java obsługuje Currying?] (Http://stackoverflow.com/questions/6134278/ does-java-support-currying) – Ascalonian

Odpowiedz

6

Po części zastosowałeś add. Jest to związane z currying.

W niektórych językach obsługujących częściową aplikację funkcje są domyślnie wybierane. możesz napisać kod taki jak:

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

Funkcja curry pozwala na częściowe zastosowanie tej funkcji bezpośrednio. Java nie obsługuje tego rodzaju rzeczy bez dodatkowych mechanizmów.

EDIT:

W Javie 8, z lambdas i java.util.function można zdefiniować funkcję 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)); 
    } 
} 

EDYCJA # 2: Myliłem się! Poprawiłem/zmodyfikowałem swoją odpowiedź. Jak zauważył sepp2k, jest to tylko aplikacja częściowa. Te dwa pojęcia są powiązane i często mylone. W mojej obronie znajduje się sekcja na stronie currying Wikipedia o mixupie.

+1

'increment' nie jest wynikiem przeklinania' add' - jest wynikiem częściowego zastosowania 'add'. Rezultatem użycia 'add' będzie funkcja, która może być wywołana jako' curriedAdd (arg1) (arg2) '. – sepp2k

+1

[Flex your PECS] (http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs)! Dla pełnej elastyczności, parametr twojej metody 'curry' powinien być zamiast tego zadeklarowany jako' BiFunction '. – Jubobs

0

Nie, po prostu to nazywacie. Musisz przekazać funkcję jako argument i zwróć częściową ocenę tej funkcji, aby nazwać ją curry.