2012-04-13 4 views
88

के बीच कोई अंतर मैं सोच रहा हूं कि First Class Function और High Order Function के बीच क्या अंतर है।प्रथम श्रेणी समारोह और उच्च आदेश फ़ंक्शन

मैं उन दो विकी पृष्ठों के माध्यम से पढ़ता हूं और वे समान दिखते हैं। यदि वे एक ही बात करते हैं, तो दो शब्दावली क्यों चाहिए?

Google पर कोशिश की लेकिन मुझे कोई उपयोगी चीज़ नहीं मिली।

उत्तर

103

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

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

दो चीजें निकटता से संबंधित हैं, क्योंकि प्रथम श्रेणी के कार्यों वाली भाषा की कल्पना करना मुश्किल है जो उच्च-आदेश कार्यों का समर्थन नहीं करेगा, और इसके विपरीत उच्च-आदेश फ़ंक्शंस वाली भाषा भी नहीं बल्कि प्रथम श्रेणी के फ़ंक्शन समर्थन के बिना।

+2

मुझे लगता है कि एक चीज़ मुझे आसानी से भ्रमित कर देती है कि वे निकट से संबंधित हैं। – Simon

+33

@ सिमॉन मुझे लगता है कि भ्रम से बचने की कुंजी यह याद रखना है कि किसी भाषा में प्रथम श्रेणी के कार्य होते हैं (आप "प्रथम श्रेणी" अन्य चीजों के बारे में भी बात कर सकते हैं, जैसे प्रथम श्रेणी के वर्ग, आदि), या यह नहीं करता है । तो आप कभी भी एक विशेष समारोह ** के बारे में बात नहीं करते हैं ** प्रथम श्रेणी या नहीं। ओटीओएच, जब आप कहते हैं कि कोई फ़ंक्शन उच्च-आदेश है या नहीं, तो यह कहता है कि यह फ़ंक्शंस पर चल रहा है या नहीं, इसलिए "उच्च-ऑर्डर-नेस" प्रत्येक व्यक्तिगत फ़ंक्शन की एक संपत्ति है। तो "प्रथम श्रेणी के कार्यों" एक भाषा की संपत्ति है, और "उच्च आदेश" एक समारोह की एक संपत्ति है। – Ben

+0

बिल्कुल बेन। मैं सोच रहा था कि उन दोनों काम के लिए एक संपत्ति दोनों हैं इसलिए मैं उलझन में था। धन्यवाद आपकी टिप्पणियां। – Simon

37

प्रथम श्रेणी के कार्य ऐसे कार्य हैं जिन्हें किसी ऑब्जेक्ट (या एक चर के लिए असाइन करने योग्य) के रूप में माना जाता है।

उच्च आदेश फ़ंक्शन ऐसे फ़ंक्शन हैं जो कम से कम एक प्रथम श्रेणी फ़ंक्शन को पैरामीटर के रूप में लेते हैं।

16

वे अलग हैं।

प्रथम श्रेणी कार्यों एक भाषा है कि समान रूप से भर में नियंत्रित किया जाता है में

मान "प्रथम श्रेणी" कहा जाता है। उन्हें डेटा संरचनाओं में संग्रहीत किया जा सकता है, तर्क के रूप में पारित किया जा सकता है, या नियंत्रण संरचनाओं में उपयोग किया जा सकता है।

भाषाएं जो फ़ंक्शन प्रकारों के साथ मानों का समर्थन करती हैं, और उन्हें गैर-फ़ंक्शन मानों के समान मानती हैं, को "प्रथम श्रेणी के कार्यों" के रूप में कहा जा सकता है।

उच्च आदेश कार्यों

प्रथम श्रेणी कार्यों होने का एक परिणाम यह है कि यदि आप किसी अन्य समारोह के लिए एक तर्क के रूप में एक समारोह पारित करने में सक्षम होना चाहिए। बाद वाला कार्य अब "उच्च आदेश" है। यह एक ऐसा कार्य है जो एक तर्क के रूप में कार्य करता है।

विहित उदाहरण "मानचित्र"

map :: (a -> b) -> [a] -> [b] 
map f []  = [] 
map f (x:xs) = f x : map f xs 

है यही कारण है कि, यह एक समारोह है, और एक सरणी लेता है, और समारोह प्रत्येक तत्व के लिए लागू के साथ एक नई सरणी देता है।

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

+1

धन्यवाद डॉन। यह व्यापक है। और मुझे लगता है कि चरण "परिणामों में से एक" उन दोनों के बीच एक तरह का रिश्ता इंगित करता है। – Simon

9

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

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

तो प्रथम श्रेणी के कार्यों की उपस्थिति (एक भाषा सुविधा के रूप में) उच्च-आदेश कार्यों की उपस्थिति का तात्पर्य है, लेकिन दूसरी तरफ नहीं।

+0

क्या आप एक उदाहरण दे सकते हैं जहां उच्च आदेश फ़ंक्शन प्रथम श्रेणी का फ़ंक्शन नहीं है। (मैंने सोचा कि दोनों एक जैसे हैं।) – ATHER

+0

@ATHER, मेरे पास ऐसी भाषा का ठोस उदाहरण नहीं है जो इस तरह के कार्यों के लिए डिज़ाइन पसंद करेगा। लेकिन कुछ ऐसा मामला है उदा। सी ++ में टेम्पलेट्स के साथ: टेम्पलेट्स उच्च-ऑर्डर होते हैं (आपके पास "टेम्पलेट टेम्पलेट पैरामीटर" हो सकते हैं), लेकिन प्रथम श्रेणी मान नहीं, यानी, टेम्पलेट सामान्य कार्यों के पैरामीटर नहीं हो सकते हैं। इसी तरह उदा। एमएल में मॉड्यूल/functors। –

+0

@AndreasRossberg क्या जावा 8 उनके प्रश्न का वैध उत्तर नहीं होगा? कार्य प्रथम श्रेणी के नागरिक नहीं हैं, लेकिन जावा विधियां फ़ंक्शनल इंटरफेस के माध्यम से फ़ंक्शंस प्राप्त कर सकती हैं, जैसा कि आपके द्वारा वर्णित "पैरामीटर हैं जो विशेष रूप से व्यवहार किए जाते हैं, और" सामान्य "मान पैरामीटर से अलग होते हैं।" – Abdul

0

प्रथम श्रेणी के कार्यों का मतलब है कि आप अन्य प्रकारों (चर, बूलियन, संख्या ...) के साथ क्या कर सकते हैं, आप इसे कार्यों के साथ कर सकते हैं।

उदाहरण के लिए उन्हें चर के लिए असाइन करें, इसे चारों ओर पास करें, उन्हें फ्लाई पर बनाएं।