यह एक दिलचस्प चर्चा है। मुझे लगता है कि @ फ्लोडेल का उदाहरण उत्कृष्ट है। हालाँकि, मुझे लगता है कि यह मेरी बात को दर्शाता है (और @koshke इस पर टिप्पणी में उल्लेख करता है) जो return
समझ में आता है जब आप एक कार्यात्मक कोडिंग शैली के बजाय एक अनिवार्य का उपयोग करते हैं ।
इस बिंदु पर विश्वास करने के लिए नहीं, लेकिन मैंने foo
इस तरह से फिर से लिखा होगा :
foo = function() ifelse(a,a,b)
एक कार्यात्मक शैली राज्य परिवर्तनों से बचती है, जैसे कि मूल्य का भंडारण output
। इस शैली में, return
जगह से बाहर है; foo
गणितीय फ़ंक्शन की तरह दिखता है।
मैं @flodel से सहमत हूं: बूलियन चर के एक जटिल प्रणाली का उपयोग bar
करना कम स्पष्ट होगा, और आपके पास होने पर व्यर्थ होगा return
। क्या बनाता है bar
ताकि उत्तरदायी return
बयान है कि यह एक जरूरी शैली में लिखा जाता है। दरअसल, बूलियन चर एक कार्यात्मक शैली में बचाए गए "राज्य" परिवर्तनों का प्रतिनिधित्व करते हैं।
bar
कार्यात्मक शैली में फिर से लिखना मुश्किल है , क्योंकि यह सिर्फ छद्म कोड है, लेकिन विचार कुछ इस तरह है:
e_func <- function() do_stuff
d_func <- function() ifelse(any(sapply(seq(d),e_func)),2,3)
b_func <- function() {
do_stuff
ifelse(c,1,sapply(seq(b),d_func))
}
bar <- function () {
do_stuff
sapply(seq(a),b_func) # Not exactly correct, but illustrates the idea.
}
while
पाश, सबसे कठिन पुनर्लेखन के लिए हो सकता है, क्योंकि यह करने के लिए राज्य में परिवर्तन द्वारा नियंत्रित किया जाता हैं a
।
कॉल के कारण होने वाली गति हानि return
नगण्य है, लेकिन return
कार्यात्मक शैली में बचने और पुन: लिखने से प्राप्त दक्षता अक्सर भारी होती है। नए उपयोगकर्ताओं को यह बताने से रोकने के लिए कि return
शायद कोई मदद नहीं करेगा, लेकिन एक कार्यात्मक शैली के लिए उन्हें मार्गदर्शन देना होगा।
@Paul return
अनिवार्य शैली में आवश्यक है क्योंकि आप अक्सर लूप में विभिन्न बिंदुओं पर फ़ंक्शन से बाहर निकलना चाहते हैं। एक कार्यात्मक शैली छोरों का उपयोग नहीं करती है, और इसलिए इसकी आवश्यकता नहीं है return
। विशुद्ध रूप से कार्यात्मक शैली में, अंतिम कॉल लगभग हमेशा वांछित रिटर्न मान होता है।
पायथन में, फ़ंक्शन को एक return
बयान की आवश्यकता होती है । हालांकि, यदि आप अपने कार्य को एक कार्यात्मक शैली में क्रमादेशित करते हैं, तो आपके पास return
अपने फ़ंक्शन के अंत में केवल एक बयान होगा ।
एक और StackOverflow पोस्ट से एक उदाहरण का उपयोग करते हुए, हम कहते हैं कि हम एक फ़ंक्शन चाहते थे जो TRUE
किसी दिए गए सभी मानों में एक x
अजीब लंबाई थी। हम दो शैलियों का उपयोग कर सकते हैं:
# Procedural / Imperative
allOdd = function(x) {
for (i in x) if (length(i) %% 2 == 0) return (FALSE)
return (TRUE)
}
# Functional
allOdd = function(x)
all(length(x) %% 2 == 1)
एक कार्यात्मक शैली में, स्वाभाविक रूप से लौटाया जाने वाला मान फ़ंक्शन के सिरों पर आता है। दोबारा, यह एक गणितीय कार्य की तरह दिखता है।
@GSee में उल्लिखित चेतावनियाँ ?ifelse
निश्चित रूप से दिलचस्प हैं, लेकिन मुझे नहीं लगता कि वे समारोह के उपयोग को रोकने की कोशिश कर रहे हैं। वास्तव में, ifelse
स्वचालित रूप से वेक्टरिंग कार्यों का लाभ है। उदाहरण के लिए, थोड़ा संशोधित संस्करण पर विचार करें foo
:
foo = function(a) { # Note that it now has an argument
if(a) {
return(a)
} else {
return(b)
}
}
यह फ़ंक्शन ठीक काम करता है जब length(a)
1. होता है, लेकिन यदि आप foo
एक के साथ फिर से लिखते हैंifelse
foo = function (a) ifelse(a,a,b)
अब foo
किसी भी लम्बाई पर काम करता है a
। वास्तव में, यह तब भी काम करेगा जब a
मैट्रिक्स है। एक मूल्य को उसी आकार में वापस करना जैसा test
कि एक विशेषता है जो वैश्वीकरण में मदद करता है, समस्या नहीं।
return
पिछले उदाहरण में भी अनावश्यक है। हटानेreturn
से यह थोड़ा तेज़ हो सकता है, लेकिन मेरे विचार में ऐसा इसलिए है क्योंकि R को एक मजेदार प्रोग्रामिंग भाषा कहा जाता है।