स्काला में निम्नलिखित दो फ़ंक्शन परिभाषाओं का क्या अंतर है:
1) def sum(f: Int => Int)(a: Int, b: Int): Int = { <code removed> }
2) def sum(f: Int => Int, a: Int, b: Int): Int = { <code removed> }
?
SBT का कंसोल REPL उनके लिए अलग मूल्य देता है इसलिए लगता है कि वे किसी तरह अलग हैं:
sum: (f: Int => Int, a: Int, b: Int)Int
sum: (f: Int => Int)(a: Int, b: Int)Int
उत्तर:
उत्तर № 1 के लिए 4पहली परिभाषा है curried, ताकि आप प्रदान कर सकें a
तथा b
किसी और समय।
उदाहरण के लिए, यदि आप उस फ़ंक्शन को जानते हैं जिसे आप वर्तमान विधि में उपयोग करना चाहते हैं, लेकिन "अभी तक तर्क नहीं जानते हैं, तो आप इसे ले सकते हैं:
def mySum(v: Int): Int = v + 1
val newsum = sum(mySum) _
इस समय, newsum
एक ऐसा फंक्शन है जो दो लेता है Int
एस और रिटर्न ए Int
.
संक्षेप के संदर्भ में यह नहीं लगता हैबहुत समझदारी; हालाँकि, बहुत बार ऐसा हुआ है कि मैं किसी प्रोग्राम के कुछ हिस्सों के लिए अलग-अलग एल्गोरिदम को वापस करना चाहता हूं जो मुझे अभी पता है, लेकिन अभी तक मापदंडों को नहीं जानते (या पहुंच है)
करी आपको वह सुविधा देता है।
जवाब के लिए 2 № 2
स्केल फ़ंक्शंस करीने में सहायता के लिए कई पैरामीटर सूचियों का समर्थन करते हैं। अपने पहले उदाहरण से, आप पहले देख सकते हैं sum
एक के रूप में कार्य करता है जो दो पूर्णांक लेता है और एक अन्य फ़ंक्शन (यानी) देता है करी) जो तब एक ले सकता है Int => Int
एक तर्क के रूप में कार्य करें।
इस सिंटैक्स का उपयोग फ़ंक्शंस बनाने के लिए भी किया जाता है जो नए सिंटैक्स के रूप में दिखते हैं और व्यवहार करते हैं। उदाहरण के लिए, def withResource(r: Resource)(block: => Unit)
कहा जा सकता है:
withResource(res) {
..
..
}