2016-11-17 4 views
5

क्या किसी को भी इसका उपयोग करने का उदाहरण मिला है और फिर सूची के साथ? मैंने देखा कि और फिर सूची के लिए परिभाषित किया गया है लेकिन दस्तावेजों को यह दिखाने के लिए एक उदाहरण नहीं मिला है कि इसका उपयोग कैसे किया जाए।और फिर सूची स्केल

मेरी समझ यह है कि एफ और फिर जी का मतलब है कि फ़ंक्शन निष्पादित करें और फिर फ़ंक्शन जी निष्पादित करें। फ़ंक्शन जी का इनपुट फ़ंक्शन f का आउटपुट है। क्या ये सही है?

प्रश्न 1 - मैंने निम्नलिखित कोड लिखा है लेकिन मुझे नहीं पता कि मुझे क्यों उपयोग करना चाहिए और तब क्योंकि मैं मानचित्र के साथ एक ही परिणाम प्राप्त कर सकता हूं।

scala> val l = List(1,2,3,4,5) 
l: List[Int] = List(1, 2, 3, 4, 5) 

//simple function that increments value of element of list 
scala> def f(l:List[Int]):List[Int] = {l.map(x=>x-1)} 
f: (l: List[Int])List[Int] 

//function which decrements value of elements of list 
scala> def g(l:List[Int]):List[Int] = {l.map(x=>x+1)} 
g: (l: List[Int])List[Int] 

scala> val p = f _ andThen g _ 
p: List[Int] => List[Int] = <function1> 

//printing original list 
scala> l 
res75: List[Int] = List(1, 2, 3, 4, 5) 

//p works as expected. 
scala> p(l) 
res74: List[Int] = List(1, 2, 3, 4, 5) 

//but I can achieve the same with two maps. What is the point of andThen? 
scala> l.map(x=>x+1).map(x=>x-1) 
res76: List[Int] = List(1, 2, 3, 4, 5) 

किसी शेयर व्यावहारिक उदाहरण हैं, जहां andthen फिल्टर की तरह तरीकों की तुलना में अधिक उपयोगी है किया जा सका, नक्शे आदि एक प्रयोग मैं ऊपर देख सकते है कि andthen साथ, मैं एक नया समारोह, पी है, जो एक संयोजन है बना सकते हैं अन्य कार्यों के। लेकिन इस उपयोग की उपयोगीता और तब,

उत्तर

11

andThenPartialFunction से List के लिए विरासत पेड़ में कुछ माता-पिता विरासत में मिला है। जब आप इंडेक्स द्वारा अपने तत्वों तक पहुंचते हैं तो PartialFunction के रूप में उपयोग करते हैं। यही है, आप List को किसी इंडेक्स (शून्य से) के फ़ंक्शन के रूप में उस तत्व के रूप में सोच सकते हैं जो उस सूची में सूची में है।

हम एक सूची है तो:

val list = List(1, 2, 3, 4) 

हम एक समारोह की तरह list कॉल कर सकते हैं (क्योंकि यह एक है):

scala> list(0) 
res5: Int = 1 

andThen हमें दूसरे के साथ एक PartialFunction लिखने देता है। उदाहरण के लिए, शायद मैं List बनाना चाहता हूं जहां मैं इंडेक्स द्वारा अपने तत्वों तक पहुंच सकता हूं, और उसके बाद तत्व को 2 से गुणा कर सकता हूं।

val list2 = list.andThen(_ * 2) 

scala> list2(0) 
res7: Int = 2 

scala> list2(1) 
res8: Int = 4 

यह अनिवार्य रूप से सूची में map का उपयोग कर, को छोड़कर गणना आलसी है के समान है। बेशक, आप एक ही चीज़ को view के साथ पूरा कर सकते हैं, लेकिन कुछ सामान्य मामला हो सकता है जहां आप List का इलाज केवल PartialFunction के रूप में करना चाहते हैं, इसके बजाय (मैं अपने सिर के ऊपर से किसी के बारे में नहीं सोच सकता) ।


अपने कोड में, आप वास्तव में List पर ही andThen उपयोग नहीं कर रहे। इसके बजाय, आप इसे map आदि पर फ़ंक्शंस के लिए उपयोग कर रहे हैं। मैपिंग f और g से दो बार और f andThen g पर एक बार मानचित्रण के बीच परिणामों में कोई अंतर नहीं है। हालांकि, कई बार मैपिंग महंगा होने पर संरचना का उपयोग करना पसंद किया जाता है। List एस के मामले में, जब सूची बड़ी होती है तो कई बार ट्रैवर्स कंप्यूटेशनल रूप से महंगी हो सकती है।

2

समाधान l.map(x=>x+1).map(x=>x-1) समाधान के साथ आप सूची को दो बार घुमा रहे हैं। andThen संयोजक का उपयोग करके 2 फ़ंक्शंस लिखते समय और फिर सूची में इसे लागू करते समय, आप केवल एक बार सूची को पार करते हैं।

val h = ((x:Int) => x+1).andThen((x:Int) => x-1) 
l.map(h) //traverses it only once 
संबंधित मुद्दे