2015-03-19 3 views
5

Я читал о выделке в функционально-программировании, и у меня есть очень простой вопрос:Функциональное программирование для начинающих: Карринг в Java

Если у меня есть две функции в Java

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

и создать другой метод

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

В приведенном выше коде, когда я писал increment функцию, я на самом деле карри add?

+0

Я понятия не имел, что такое каррирование, поэтому мне пришлось посмотреть его. Думал, что поделился бы статьей Википедии о [Currying] (http://en.wikipedia.org/wiki/Currying) – Ascalonian

+0

Похожие сообщения: [Поддерживает ли java Currying?] (Http://stackoverflow.com/questions/6134278/ do-java-support-currying) – Ascalonian

ответ

6

Вы частично применили add. Это связано с каррированием.

На некоторых языках, поддерживающих частичное приложение, функции по умолчанию заданы. вы, возможно, сможете написать код:

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

Функция curries позволяет частично применить эту функцию непосредственно. Java не поддерживает такие вещи без дополнительных механизмов.

EDIT:

В Java 8, с лямбды и java.util.function, вы можете определить функцию Карри.

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: я был неправ! Я исправил/изменил свой ответ. Как указывал sepp2k, это только приложение с частичной функцией. Эти две концепции связаны и часто путают. В моей защите есть раздел на странице Википедии о смешении.

+1

'increment' не является результатом currying' add' - это результат частичного применения 'add'. Результат currying 'add' будет функцией, которая может быть вызвана как' curriedAdd (arg1) (arg2) '. – sepp2k

+1

[Flex your PECS] (http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs)! Для полной гибкости параметр вашего метода curry должен быть объявлен как «BiFunction '. – Jubobs

0

Нет, вы просто позвоните. Вам нужно передать функцию в качестве аргумента и вернуть частичную оценку этой функции, чтобы вызвать ее currying.

Смежные вопросы