2015-03-05 6 views
7

मैं नाम-पैरामीटर के साथ एक अनाम फ़ंक्शन लिखने के लिए संघर्ष कर रहा हूं। यहाँ मैं थक गया हूँ।स्कैला अज्ञात फ़ंक्शन पर नाम पैरामीटर

val fun = (x: Boolean, y: =>Int) => if(x) y else 0 

यह निम्न त्रुटि के साथ विफल रहता है।

Error:(106, 31) identifier expected but '=>' found. 
    val fun = (x: Boolean, y: =>Int) => if(x) y else 0 
          ^
Error:(109, 3) ')' expected but '}' found. 
    } 
^

मानक फ़ंक्शन के रूप में कभी भी एक ही कोड कैसे काम करता है।

def fun1(x: Boolean, y: =>Int) = if(x) y else 0 

कोई बात नहीं?

--------------- संपादित -----------------

मैं एक दो भाग समस्या थी। सेनिया उत्तर ने शुरुआती मामला हल किया। मान लीजिए मेरे पास एक फ़ंक्शन एक फ़ंक्शन लेता है।

def xxx[A,B](f:(A,=>B)=>B)={} 

सेनिया समाधान के अनुसार यह काम करता है।

val fun: (Int, =>Boolean) => Boolean = (x, y) => y 
xxx[Int,Boolean](fun) 

हालांकि मैं इंटरमीडिएट मजे से छुटकारा पाने और अज्ञात फ़ंक्शन के साथ xxx पर कॉल करना चाहता हूं।

xxx((Int, =>Boolean) => Boolean = (x, y) => y) 

काम नहीं करेगा। कोई जानकारी यह कैसे करनी है ?

उत्तर

9

आप इस तरह, अनाम समारोह के प्रकार को निर्दिष्ट कर सकता है बजाय मापदंडों के प्रकार के:

val fun: (Boolean, => Int) => Int = (x, y) => if(x) y else 0 

scala> fun(false, {println("!"); 2}) 
res1: Int = 0 

scala> fun(true, {println("!"); 2}) 
! 
res2: Int = 2 

=> Int एक सही प्रकार नाम नहीं है, यह विधि घोषणा के मापदंडों ब्लॉक में दर-नाम मापदंडों के लिए एक विशेष वाक्य रचना है या अनाम कार्य प्रकार।

SLS4,6 समारोह घोषणाएं और परिभाषाएँ

ParamType ::= Type 
      | ‘=>’ Type 
      | Type ‘*’ 

मामले में देखें आप वेरिएबल को गुमनाम समारोह आवंटित करने के लिए नहीं करना चाहते हैं आप कर सकते थे इस तरह या तो उपयोग प्रकार निष्कर्ष:

xxx[Int, Boolean]{ (x, y) => y } 

या इस प्रकार अपना प्रकार निर्दिष्ट करें:

xxx({ (x, y) => y }: ((Int, => Boolean) => Boolean)) 
+0

हाय, आपका समाधान काम करता है। हालांकि मेरे पास एक और चीज है। मूल पोस्ट संपादित किया। क्या आप मेरी मदद कर सकते हैं। –

+0

@ साजिथसिल्वा: अद्यतन – senia

+0

देखें धन्यवाद वास्तव में मदद के लिए उपयुक्त है। –

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