जंजीर विधि है कि करी के बराबर विधि प्रति केवल एक पैरामीटर की आवश्यकता है?


15

मैं रूबी के साथ हाल ही में कर रहा हूँ और मैंने पाया कि अगर शुद्ध वस्तु उन्मुख भाषाओं (और यहां तक ​​कि शुद्ध नहीं हैं) बनाने के तरीके हैं जो केवल एक पैरामीटर लेते हैं और फिर एक साथ जंजीर में बंध जाते हैं तो एक कार्यात्मक के साथ भाषाओं में करीने के बराबर है अंदाज? यदि नहीं, तो क्यों नहीं? मैं इस विषय पर एक विस्तृत, यहां तक ​​कि कठोर जवाब की सराहना करता हूं।

जवाबों:


14

ऑब्जेक्ट ओरिएंटेड लैंग्वेजेज में चेंज करने का तरीका करी से थोड़ा अलग है। द्वारा परिभाषा , currying का परिणाम मूल की एक और अधिक सीमित रूप है समारोहकन्वेंशन द्वारा , विधि चिनिंग का परिणाम मूल (आमतौर पर गैर-फ़ंक्शन) ऑब्जेक्ट का एक संशोधित रूप है । विधि जंजीर का उपयोग एक ही वर्ग पर असंबंधित विधियों के साथ किया जा सकता है, जबकि क्यूरिंग में एक फ़ंक्शन वापस करना शामिल होता है जहां मूल फ़ंक्शन के एक या अधिक पैरामीटर तय होते हैं (पूर्व निर्धारित)।

Java में मेथड चेनिंग इस प्रकार है:

String myString = new StringBuilder("Hi ").append(firstName)
                                          .append(" ")
                                          .append(lastName)
                                          .append("!")
                                          .toString();

तो, उनमें से प्रत्येक .append () विधि कॉल अनाम StringBuilder ऑब्जेक्ट के लिए एक पॉइंटर लौटाता है। यह ऑब्जेक्ट प्रत्येक .append () के बाद पूरा होता है, और यह एक फ़ंक्शन नहीं है।

इसके विपरीत, स्काला में, आंशिक अनुप्रयोग या करीकरण निम्नानुसार है:

def simple(x:Int, y:Int, z:Int) = x * (y + z)
val simpler = simple(2, _:Int, _:Int)
simpler(3, 4) => 14

( डैनियल यांकोव्स्की के ब्लॉग से लिया गया नमूना )

simpler()इस उदाहरण में के लिए एक आवरण समारोह है simple()simpler()अभी भी एक ऐसा कार्य है जो किसी भी चीज़ का मूल्यांकन करने से पहले अधिक मापदंडों को लेता है लेकिन स्वयं का एक अधिक सीमित संस्करण।

संपादित करें: एक दिन बाद इसे पढ़ना, मुझे लगता है कि "रैपर-फंक्शन" प्रमुख है। करी या आंशिक अनुप्रयोग को रैपर तरीकों से जावा में सर्वोत्तम रूप से अनुकरण किया जा सकता है।

public interface Simpler {
    public int apply(int y, int z);
}

public class Simple {
    public int apply(int x, int y, int z) { return x * (y + z); }

    public Simpler partiallyApply(final int x) {
        final simple = this;
        return new Simpler() {
            @Override
            public int apply(int y, int z) {
                // x is the final int parameter to partiallyApply()
                simple.apply(x, y, z);
            }
        }
    }
}

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

विधि जंजीर आंशिक अनुप्रयोग या करी के समान हो सकता है, लेकिन यह केवल उन विधियों के बराबर हो सकता है जो अन्य विधियों (फ़नसर्स को देखें) को वापस करते हैं, और फिर विधियों को वापसी प्रकारों के साथ सेट करने की आवश्यकता होती है जो सार्थक रूप से मॉडल करी या आंशिक अनुप्रयोग के साथ सेट होते हैं।

विधि का उपयोग अधिक बार आलसी मूल्यांकन जैसे कुछ को लागू करने के लिए किया जाता है, जैसा कि "बिल्डर" डिजाइन पैटर्न और जावा 8 में नए कलेक्शंस लाइब्रेरी इंटरफेस के साथ किया जाता है

मुझे आशा है कि वह मदद करेंगे।


+1: मुझे पता था कि, लेकिन मुझे नहीं लगता कि मैं इसे कहीं भी पास में व्यक्त कर सकता था और साथ ही साथ आपने भी किया था।
पीटर रोवेल

अच्छी तरह से समझाया गया है, यहाँ एक हरे रंग का चेकमार्क है और आपकी परेशानी का कारण है।
वर्ल्ड इंजीनियर

StringBuilder के बहुत अच्छे उदाहरण के बारे में प्रश्न - toString()कॉल के बिना हम प्रभावी रूप से हमारे कॉल में करी करने के इरादे की नकल नहीं कर रहे हैं? मैं सीधे OO में करी की अवधारणा प्राप्त करने की कोशिश कर रहा हूं।
श्रीधर सरनोबत

1
@ श्रीधर-सरनोबत एक क्यूरेटेड फंक्शन कम मापदंडों के साथ एक और फ़ंक्शन देता है। निकाले गए पैरामीटर को दिए गए फ़ंक्शन में आंतरिक स्थिरांक में बदल दिया जाता है। कुछ वस्तुओं को जावा 8 में कार्यों की तरह व्यवहार किया जाता है, जिससे यह भ्रामक हो सकता है, लेकिन स्ट्रिंगबर्स्ट उनमें से एक नहीं है। हम्म, स्ट्रिंगबुर्टल के भीतर, append(charSeq)फ़ंक्शन फ़ंक्शन का एक घुला हुआ रूप है, insert(destOffset, charSeq)जहां destOffsetहमेशा स्ट्रिंगबुलस्ट की लंबाई होती है।
ग्लेनपेटर्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.