Scala Language
उच्च आदेश समारोह
खोज…
टिप्पणियों
स्केला सिंटैक्टली समान के रूप में तरीकों और कार्यों का इलाज करने के लिए महान लंबाई तक जाता है। लेकिन हुड के तहत, वे अलग अवधारणाएं हैं।
एक विधि निष्पादन योग्य कोड है, और इसका कोई मूल्य प्रतिनिधित्व नहीं है।
एक समारोह प्रकार का एक वास्तविक वस्तु उदाहरण है Function1
(या किसी अन्य arity के एक समान प्रकार)। इसका कोड इसकी apply
विधि में निहित है। प्रभावी रूप से, यह बस एक मूल्य के रूप में कार्य करता है जिसे चारों ओर से पारित किया जा सकता है।
संयोग से, मूल्यों के रूप में इलाज कार्यों की क्षमता वास्तव में उच्च क्रम कार्यों के लिए समर्थन कर रहा एक भाषा से क्या मतलब है है। फ़ंक्शन उदाहरण इस सुविधा को लागू करने के लिए स्काला का दृष्टिकोण है।
एक वास्तविक उच्च-क्रम फ़ंक्शन एक फ़ंक्शन है जो या तो फ़ंक्शन मान को एक तर्क के रूप में लेता है या फ़ंक्शन मान लौटाता है। लेकिन स्काला में, जैसा कि सभी संचालन विधियां हैं, यह उन तरीकों के बारे में सोचने के लिए अधिक सामान्य है जो फ़ंक्शन पैरामीटर प्राप्त करते हैं या वापस करते हैं। तो map
, के रूप में परिभाषित किया गया पर Seq
अपने पैरामीटर एक समारोह होने के कारण एक "उच्च क्रम समारोह" रूप में सोचा जा सकता है, लेकिन यह सचमुच एक समारोह नहीं है, यह एक विधि है।
फ़ंक्शन मान के रूप में विधियों का उपयोग करना
स्काला संकलक स्वचालित रूप से उच्च मूल्यों वाले कार्यों में उन्हें पारित करने के उद्देश्य से विधियों को फ़ंक्शन मानों में परिवर्तित करेगा।
object MyObject {
def mapMethod(input: Int): String = {
int.toString
}
}
Seq(1, 2, 3).map(MyObject.mapMethod) // Seq("1", "2", "3")
ऊपर दिए गए उदाहरण में, MyObject.mapMethod
एक फ़ंक्शन कॉल नहीं है, लेकिन इसके बजाय मान के रूप में map
करने के लिए पास किया गया है। वास्तव में, map
को इसके लिए पारित एक फ़ंक्शन मान की आवश्यकता होती है, जैसा कि यह हस्ताक्षर में देखा जा सकता है। List[A]
के map
के लिए हस्ताक्षर (प्रकार A
की वस्तुओं की सूची) है:
def map[B](f: (A) ⇒ B): List[B]
f: (A) => B
भाग इंगित करता है कि इस विधि कॉल के लिए पैरामीटर कुछ फ़ंक्शन है जो प्रकार A
की वस्तु लेता है और प्रकार B
का एक वस्तु लौटाता है। A
और B
को मनमाने ढंग से परिभाषित किया गया है। पहले उदाहरण पर लौटते हुए, हम देख सकते हैं कि mapMethod
एक Int
(जो कि A
मेल खाती है) लेता है और एक String
(जो B
मेल खाती है) को लौटाता है। इस प्रकार mapMethod
map
पास करने के लिए एक वैध फ़ंक्शन मान है। हम इस तरह से एक ही कोड को फिर से लिख सकते हैं:
Seq(1, 2, 3).map(x:Int => int.toString)
यह फ़ंक्शन मान को इनलाइन करता है, जो सरल कार्यों के लिए स्पष्टता जोड़ सकता है।
उच्च आदेश कार्य (पैरामीटर के रूप में कार्य)
एक उच्च-क्रम फ़ंक्शन, पहले-क्रम फ़ंक्शन के विपरीत, तीन रूपों में से एक हो सकता है:
इसका एक या अधिक पैरामीटर एक फ़ंक्शन है, और यह कुछ मान लौटाता है।
यह एक फ़ंक्शन देता है, लेकिन इसका कोई भी पैरामीटर एक फ़ंक्शन नहीं है।
उपरोक्त दोनों: इसका एक या अधिक पैरामीटर एक फ़ंक्शन है, और यह एक फ़ंक्शन देता है।
object HOF { def main(args: Array[String]) { val list = List(("Srini","E"),("Subash","R"),("Ranjith","RK"),("Vicky","s"),("Sudhar","s")) //HOF val fullNameList= list.map(n => getFullName(n._1, n._2)) } def getFullName(firstName: String, lastName: String): String = firstName + "." + lastName }
यहाँ मानचित्र फ़ंक्शन एक पैरामीटर के रूप में एक getFullName(n._1,n._2)
फ़ंक्शन लेता है। इसे HOF (हायर ऑर्डर फंक्शन) कहा जाता है ।
तर्क आलसी मूल्यांकन
Scala संकेतन का उपयोग करते हुए फ़ंक्शन तर्कों के लिए आलसी मूल्यांकन का समर्थन करता है: def func(arg: => String)
। ऐसे फ़ंक्शन तर्क नियमित String
ऑब्जेक्ट या उच्च क्रम फ़ंक्शन को String
रिटर्न प्रकार के साथ ले सकते हैं। दूसरे मामले में, फ़ंक्शन तर्क का मूल्यांकन मूल्य के उपयोग पर किया जाएगा।
कृपया उदाहरण देखें:
def calculateData: String = {
print("Calculating expensive data! ")
"some expensive data"
}
def dumbMediator(preconditions: Boolean, data: String): Option[String] = {
print("Applying mediator")
preconditions match {
case true => Some(data)
case false => None
}
}
def smartMediator(preconditions: Boolean, data: => String): Option[String] = {
print("Applying mediator")
preconditions match {
case true => Some(data)
case false => None
}
}
smartMediator(preconditions = false, calculateData)
dumbMediator(preconditions = false, calculateData)
smartMediator
कॉल कोई भी मान नहीं लौटाएगा और "Applying mediator"
संदेश प्रिंट करेगा।
dumbMediator
कॉल कोई भी मान नहीं लौटाएगा और संदेश "Calculating expensive data! Applying mediator"
।
जब आप महंगे तर्कों की ओवरहेड का अनुकूलन करना चाहते हैं, तो आलसी मूल्यांकन बेहद उपयोगी हो सकता है।