2011-10-09 15 views
9

में समान करीबी प्रकारों के बीच अंतर निम्नलिखित दो कार्यों के प्रकारों के बीच क्या अंतर है?स्कैला

def add1: Int => Int => Int = a => b => a + b 
def add2(a: Int)(b: Int) = a + b 

उनकी घोषणाओं के आधार पर, वे एक ही प्रकार के प्रतीत होते हैं। दोनों एक ही तरह से कहा जाता है:

scala> :t add1 
Int => Int => Int 

scala> :t add2 
(a: Int)(b: Int)Int 

साथ ही, add1 का आंशिक आवेदन थोड़ा add2 की तुलना में क्लीनर है:

scala> add1(1)(2) 
res2: Int = 3 

scala> add2(1)(2) 
res3: Int = 3 

हालांकि, वहाँ उनके प्रकारों में एक स्पष्ट अंतर है।

scala> add1(1) 
res4: Int => Int = <function1> 

scala> add2(1)(_) 
res5: Int => Int = <function1> 

उत्तर

7

add1 कोई पैरामीटर है कि एक Function1[Int, Function1[Int, Int]] रिटर्न के साथ एक विधि है: इस स्केला में curried तरीकों के बारे में एक महान दस्तावेज है। add2 एक ऐसी विधि है जो दो पैरामीटर सूचियों को लेती है और Int देता है।

अतिरिक्त पठन:

Difference between method and function in Scala

1

निश्चित रूप से दो परिभाषाओं के बीच एक अंतर है। प्रत्येक एक तर्क को पारित करने पर विचार करें।

add1(1) 
(Int) => Int = <function1> 

add2(1) 
<console>:9: error: missing arguments for method add2 in object $iw; 
follow this method with `_' if you want to treat it as a partially applied function 
     add2(1) 

हालांकि, यदि आप आंशिक रूप से add2 लागू करते हैं तो यह add1 जैसा ही है।

scala> :t add1 
(Int) => (Int) => Int 

scala> :t add2 _ 
(Int) => (Int) => Int 

मैं add1 पूरी तरह से समझता हूं। यह एक अनाम कार्य है जो एक इंट और रिटर्न और Int => Int लेता है। यह एक करीबी समारोह की क्लासिक परिभाषा है।

मुझे add2 पूरी तरह से अच्छी तरह समझने से पहले मुझे और अधिक पढ़ने की आवश्यकता है। जहां तक ​​मैं कह सकता हूं, यह उन कार्यों को लिखने का एक तरीका है जो अपने पैरामीटर को एक अलग रूप में लेते हैं (यानी add2(1)(2)) और आसानी से एक करीबी फ़ंक्शन (add2 _) में परिवर्तित किया जा सकता है।

आशा है कि इससे मदद मिलती है! मैं add2 के बारे में बेहतर स्पष्टीकरण की भी प्रतीक्षा करता हूं।

संपादित करें: http://www.codecommit.com/blog/scala/function-currying-in-scala

1

x.add1 एक समारोह Int => Int => Int है।

x.add2 एक विधि है, जो एक मान नहीं है और add1 जैसा ही नहीं है। x.add1 के समतुल्य ऑब्जेक्ट प्राप्त करने के लिए, आपको x.add2 _ का उपयोग करना होगा।