के रूप में करीबी कार्य पास करें क्या यह निम्न की तरह कुछ करना संभव है?स्कैला: पैरामीटर
def takeCurriedFnAsArg(f: (Int)(implicit MyClass) => Result)
के रूप में करीबी कार्य पास करें क्या यह निम्न की तरह कुछ करना संभव है?स्कैला: पैरामीटर
def takeCurriedFnAsArg(f: (Int)(implicit MyClass) => Result)
हां, यह संभव है।
आप दूसरी curried पैरामीटर implicit
के रूप में चिह्नित है, समारोह हो रहा है न प्रकार के
Int => (MyClass => Result) => ResultOfFunction
जो यह होगा अगर curried उच्च आदेश समारोह पैरामीटर एक नियमित पैरामीटर था हो सकता है; इसके बजाय, यह इस तरह दिखता है:
Int => ResultOfFunction
यहां एक त्वरित उदाहरण है:
scala> def curriedFn(i : Int)(implicit func : String => Int) : Boolean = (i + func("test!")) % 2 == 0
curriedFn: (i: Int)(implicit func: String => Int)Boolean
scala> implicit val fn : String => Int = s => s.length
fn: String => Int = <function1>
scala> curriedFn _
res4: Int => Boolean = <function1>
आप देख सकते हैं, implicit
पैरामीटर 'सफाया' हो गया। क्यों और कैसे? यह मेरे लिए किसी से अधिक जानकार के लिए एक सवाल है। अगर मुझे लगता है, तो मैं कहूंगा कि संकलक सीधे अंतर्निहित मूल्य के साथ पैरामीटर को प्रतिस्थापित करता है, लेकिन यह बहुत अच्छा हो सकता है। , प्रकार
scala> def curriedNonImplicit(i : Int)(fn : String => Int) : Boolean = (i + fn("test!")) % 2 == 0
curriedNonImplicit: (i: Int)(fn: String => Int)Boolean
scala> curriedNonImplicit _
res5: Int => ((String => Int) => Boolean) = <function1>
आप देख सकते हैं:
scala> def foo(func : Int => Boolean) = if(func(3)) "True!" else "False!"
foo: (func: Int => Boolean)String
scala> foo(curriedFn)
res2: String = True!
अब अगर दूसरा समारोह पैरामीटर निहित नहीं था:
वैसे भी, digressions अलग रूप में, यहाँ बहुत अपनी स्थिति के लिए प्रासंगिक एक उदाहरण है समारोह का थोड़ा अलग है। इसका मतलब है कि समाधान भी अलग दिखेगा:
scala> def baz(func : Int => (String => Int) => Boolean) = if(func(3)(s => s.length)) "True!" else "False!"
baz: (func: Int => ((String => Int) => Boolean))String
scala> baz(curriedNonImplicit)
res6: String = True!
आप समारोह के रूप में यह परोक्ष से पहले प्रदान नहीं किया गया, विधि के अंदर सीधे निर्दिष्ट करना होगा।
पूरी तरह से उदाहरणों के साथ दोनों मामलों (अंतर्निहित और बिना) समझाए जाने के लिए धन्यवाद। – Prasanna