2013-10-26 4 views

उत्तर

10

हां, यह संभव है।

आप दूसरी 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! 

आप समारोह के रूप में यह परोक्ष से पहले प्रदान नहीं किया गया, विधि के अंदर सीधे निर्दिष्ट करना होगा।

+0

पूरी तरह से उदाहरणों के साथ दोनों मामलों (अंतर्निहित और बिना) समझाए जाने के लिए धन्यवाद। – Prasanna

संबंधित मुद्दे