2015-02-17 8 views
5

मान लीजिए मैं दो कार्यों f और g है:andthen स्काला में दो तर्क के समारोह के लिए

val f: (Int, Int) => Int = _ + _ 
val g: Int => String = _ + "" 

अब मैं h

val h: (Int, Int) => String = f andThen g 

दुर्भाग्य से यह एक समारोह पाने के लिए andThen के साथ उन्हें रचना चाहते हैं संकलित नहीं करता है :(

scala> val h = (f andThen g) 
<console> error: value andThen is not a member of (Int, Int) => Int 
    val h = (f andThen g) 

यह संकलित क्यों नहीं करता है और प्राप्त करने के लिए मैं f और g कैसे लिख सकता हूं?

+2

की संभावित डुप्लिकेट [क्यों Function2 एक andthen विधि नहीं है?] (Https://stackoverflow.com/questions/21680117/why-doesnt-function2-have-an-andthen-method) – theon

उत्तर

9

यह संकलन नहीं है क्योंकि andThenFunction1 की एक विधि है (एक पैरामीटर के एक समारोह: देखने scaladoc)।

आपका फ़ंक्शन f में दो पैरामीटर हैं, इसलिए Function2 का उदाहरण होगा (scaladoc देखें)।

scala> val h = f.tupled andThen g 
h: (Int, Int) => String = <function1> 

परीक्षण:

scala> val t = (1,1) 
scala> h(t) 
res1: String = 2 

तुम भी कॉल h अधिक को लिख सकते हैं

यह संकलन करने के लिए, आप एक पैरामीटर के एक समारोह में f को बदलने के लिए, tupling द्वारा की जरूरत है बस auto-tupling की वजह से, स्पष्ट रूप से टुपल बनाने के बिना (हालांकि ऑटो-टुपलिंग भ्रम और प्रकार की सुरक्षा के नुकसान की संभावना के कारण थोड़ा विवादास्पद है):

scala> h(1,1) 
res1: String = 2 
+0

धन्यवाद! मैं शायद 'tupled' का उपयोग करेंगे। – Michael

6

Function2 में andThen विधि नहीं है।

आप मैन्युअल रूप से, उन्हें रचना कर सकते हैं, हालांकि:

val h: (Int, Int) => String = { (x, y) => g(f(x,y)) } 
संबंधित मुद्दे