2015-03-19 12 views
5

मैं कार्यात्मक-प्रोग्रामिंग में currying के बारे में पढ़ रहा था में Currying, और मैं एक बहुत ही बुनियादी सवाल है: यदि मैं जावाकार्यात्मक प्रोग्रामिंग शुरुआती: जावा

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

में दो कार्य है

और मैं एक और बनाने विधि

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

उपरोक्त कोड में, जब मैं increment समारोह में लिखा है, मैं वास्तव में add करी किया?

+0

मुझे पता नहीं क्या currying था, तो मैं उसे ढूंढने की थी। सोचा मैं [Currying] पर विकिपीडिया लेख का हिस्सा होगा (http://en.wikipedia.org/wiki/Currying) – Ascalonian

+0

संबंधित पोस्ट: [? क्या जावा समर्थन Currying] (http://stackoverflow.com/questions/6134278/ करता है-जावा-support-currying) – Ascalonian

उत्तर

6

आप आंशिक रूप से add आवेदन किया है। यह करी से संबंधित है।

कुछ भाषाओं कि आंशिक आवेदन का समर्थन में, कार्यों डिफ़ॉल्ट रूप से curried कर रहे हैं। आप लिखने के कोड जैसे सक्षम हो सकते हैं:

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

एक करीबी फ़ंक्शन आपको आंशिक रूप से उस फ़ंक्शन को सीधे लागू करने की अनुमति देता है। जावा अतिरिक्त मशीनरी के बिना उस तरह की चीज़ का समर्थन नहीं करता है।

संपादित करें:

जावा 8 में, lambdas के साथ और 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)); 
    } 
} 

संपादित करें # 2: मैं गलत था! मैंने अपना जवाब सही/संशोधित किया है। जैसा कि sepp2k ने बताया कि यह केवल आंशिक कार्य अनुप्रयोग है। दो अवधारणाएं संबंधित हैं और अक्सर उलझन में हैं। मेरी रक्षा में मिश्रण के बारे में विकिपीडिया पृष्ठ को घुमाने पर एक अनुभाग है।

+1

'' increment' currying add' का परिणाम नहीं है - यह आंशिक रूप से लागू करने के 'add' का परिणाम है। 'Add' को घुमाने का नतीजा एक ऐसा कार्य होगा जिसे' curriedAdd (arg1) (arg2) 'कहा जा सकता है। – sepp2k

+1

[अपने पीईसीएस फ्लेक्स] (http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs)! पूर्ण लचीलापन के लिए, आपके 'करी' विधि के पैरामीटर को 'बीफंक्शन <के रूप में घोषित किया जाना चाहिए? सुपर टी,? सुपर यू,? आर> 'बढ़ाता है। – Jubobs

0

नहीं, आप बस इसे कहते हैं। आपको तर्क के रूप में कार्य को पारित करने की आवश्यकता है, और उस फ़ंक्शन के आंशिक मूल्यांकन को इसे घुमाने के लिए वापस करने की आवश्यकता है।

संबंधित मुद्दे