स्कैला में एक फ़ंक्शन एक ऑब्जेक्ट है जो FunctionN
लक्षणों में से एक को लागू करता है। उदाहरण के लिए:फ़ंक्शन एन विशेषता क्या है जो एक उप-पैरामीटर लेते हुए फ़ंक्शन का प्रतिनिधित्व करती है?
scala> def f(x: Int) = x * x
f: (x: Int)Int
scala> val ff = f _
ff: Int => Int = <function1>
scala> val fff: Function1[Int, Int] = f _
fff: Int => Int = <function1>
अभी तक, बहुत अच्छा है। लेकिन क्या होगा यदि हमारे पास कोई ऐसा कार्य है जो उप-नाम पैरामीटर लेता है? यह निश्चित रूप से अभी भी FunctionN
लक्षण में से एक को लागू करता है:
scala> def g(x: => Int) = x * x
g: (x: => Int)Int
scala> val gg = g _
gg: => Int => Int = <function1>
scala> gg.isInstanceOf[Function1[_, _]]
res0: Boolean = true
लेकिन किस प्रकार यह है, वास्तव में? यह Function1[Int, Int]
नहीं है:
scala> val ggg: Function1[Int, Int] = g _
<console>:8: error: type mismatch;
found : => Int => Int
required: Int => Int
val ggg: Function1[Int, Int] = g _
^
न ही यह Function1[Function0[Int], Int]
है:
scala> val ggg: Function1[=> Int, Int] = g _
<console>:1: error: identifier expected but '=>' found.
val ggg: Function1[=> Int, Int] = g _
^
तो यह क्या है:
scala> val ggg: Function1[Function0[Int], Int] = g _
<console>:8: error: type mismatch;
found : => Int => Int
required:() => Int => Int
val ggg: Function1[Function0[Int], Int] = g _
^
और Function1[=> Int, Int]
संकलन करने में विफल रहता है?
निश्चित - मुझे कोई संदेह नहीं है कि हुड के नीचे क्या हो रहा है।लेकिन अगर मैं इसे अनुमानित करने की अनुमति देने के बजाय फ़ंक्शन के प्रकार को निर्दिष्ट करना चाहता हूं, तो यह वास्तव में क्या है? निश्चित रूप से यह मामला नहीं हो सकता है कि मैं कुछ ऐसा बना सकता हूं जहां मैं अपना प्रकार लिख नहीं सकता? यह कर सकते हैं?! –
मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं। यही कहना है कि वास्तव में एक उप-नाम तर्क के अनुरूप एक 'प्रकार' है। जैसे 'gg.getClass.getMethods.find (_। getName ==" लागू करें ") प्राप्त करें। 'फंक्शन 0' का एक तर्क प्रकार भी प्राप्त करें। लेकिन * कंपाइलर * के लिए, यह रूपांतरण अभी तक नहीं हुआ है, इस प्रकार यह आपको बताता है कि 'फंक्शन 0' आवश्यक प्रकार नहीं है (आपकी पिछली बार कोशिश करें)। –