अब जब आपने लगभग पूरी तरह से अलग प्रश्न पूछने के लिए संपादित किया है, तो मैं एक अलग उत्तर दूंगा। नक्शे और फ़ोल्डरों पर एक ट्यूटोरियल को इंगित करने के बजाय, मैं बस एक दे दूंगा।
स्कैला में, आपको सबसे पहले अज्ञात फ़ंक्शन बनाने का तरीका जानने की आवश्यकता है। यह अधिक विशिष्ट करने के लिए तो जैसे चला जाता है, सबसे सामान्य से:
(var1: Type1, var2: Type2, ..., varN: TypeN) => /* output */
(var1, var2, ..., varN) => /* output, if types can be inferred */
var1 => /* output, if type can be inferred and N=1 */
यहाँ कुछ उदाहरण हैं:
(x: Double, y: Double, z: Double) => Math.sqrt(x*x + y*y + z*z)
val f:(Double,Double)=>Double = (x,y) => x*y + Math.exp(-x*y)
val neg:Double=>Double = x => -x
अब, सूचियों के map
विधि और इस तरह के एक समारोह (गुमनाम या अन्यथा) लागू होगी मानचित्र के हर तत्व। यही कारण है कि, अगर आप
List(a1,a2,...,aN)
f:A => B
है तो
List(a1,a2,...,aN) map (f)
पैदा करता
List(f(a1) , f(a2) , ..., f(aN))
कारण यह उपयोगी हो सकता है के सभी प्रकार के होते हैं। हो सकता है कि आपके पास तारों का एक गुच्छा हो और आप जानना चाहते हैं कि प्रत्येक कितना समय है, या आप उन्हें सभी ऊपरी मामले बनाना चाहते हैं, या आप उन्हें पीछे की तरफ चाहते हैं।
scala> List("How","long","are","we?") map (s => s.length)
res0: List[Int] = List(3, 4, 3, 3)
scala> List("How","capitalized","are","we?") map (s => s.toUpperCase)
res1: List[java.lang.String] = List(HOW, CAPITALIZED, ARE, WE?)
scala> List("How","backwards","are","we?") map (s => s.reverse)
res2: List[scala.runtime.RichString] = List(woH, sdrawkcab, era, ?ew)
तो, कि सामान्य रूप में नक्शा है, और स्काला में: यदि आप एक समारोह है, तो क्या आप एक तत्व को, नक्शे सभी तत्वों के लिए यह करना होगा चाहते हैं करता है।
लेकिन अगर हम अपने परिणाम एकत्र करना चाहते हैं तो क्या होगा? यही वह जगह है जहां गुना आता है (foldLeft
जो संस्करण बाईं ओर से शुरू होता है और सही काम करता है)।
मान लीजिए कि हमारे पास एक कार्य f:(B,A) => B
है, यानी, यह बी और ए लेता है, और उन्हें बी बनाने के लिए जोड़ता है, ठीक है, हम बी के साथ शुरू कर सकते हैं, और उसके बाद ए की हमारी सूची को खिला सकते हैं एक समय, और इसके अंत में, हमारे पास कुछ बी होगा। यह वही है जो ठीक है। foldLeft
यह सूची के बाईं ओर से शुरू होता है; foldRight
दाएं से शुरू होता है। यही कारण है,
List(a1,a2,...,aN) foldLeft(b0)(f)
f(f(... f(f(b0,a1) , a2) ...), aN)
जहां b0
ज़ाहिर है, है, अपने प्रारंभिक मूल्य पैदा करता है।
तो, शायद हमारे पास एक ऐसा फ़ंक्शन है जो एक int और स्ट्रिंग लेता है, और स्ट्रिंग की int या लंबाई देता है, जो भी अधिक हो - यदि हम इसका उपयोग करके हमारी सूची को जोड़ते हैं, तो यह हमें सबसे लंबी स्ट्रिंग बताएगा (मानते हुए कि हम 0 से शुरू करते हैं)। या हम int के रूप में लंबाई जोड़ सकते हैं, मूल्यों को जमा करते समय हम जाते हैं।
चलिए इसे आज़माएं।
scala> List("How","long","is","longest?").foldLeft(0)((i,s) => i max s.length)
res3: Int = 8
scala> List("How","long","is","everyone?").foldLeft(0)((i,s) => i + s.length)
res4: Int = 18
ठीक है, ठीक है, लेकिन क्या हम जानना चाहते हैं जो सबसे लंबे समय तक है चाहते हैं? एक तरीका (शायद सबसे अच्छा नहीं, लेकिन यह एक उपयोगी पैटर्न को अच्छी तरह से दिखाता है) लंबाई (एक पूर्णांक) और दोनों प्रमुख दावेदार (एक स्ट्रिंग) के साथ ले जाने के लिए है।के कि एक जाना देता हूँ:
scala> List("Who","is","longest?").foldLeft((0,""))((i,s) =>
| if (i._1 < s.length) (s.length,s)
| else i
|)
res5: (Int, java.lang.String) = (8,longest?)
यहाँ, i
अब प्रकार (Int,String)
की एक टपल है, और i._1
कि टपल (एक इंट) का पहला हिस्सा है।
लेकिन कुछ मामलों में, एक गुना का उपयोग करना वास्तव में हम नहीं चाहते हैं। यदि हम दो तारों के लंबे समय तक चाहते हैं, तो सबसे प्राकृतिक कार्य max:(String,String)=>String
जैसा होगा। हम इसे कैसे लागू करते हैं?
ठीक है, इस मामले में, एक डिफ़ॉल्ट "सबसे छोटा" मामला है, इसलिए हम स्ट्रिंग-अधिकतम फ़ंक्शन को "" से शुरू कर सकते हैं। लेकिन को कम करने का एक बेहतर तरीका है। गुना के साथ, दो संस्करण हैं, जो बाएं से काम करता है, दूसरा जो दाईं ओर से काम करता है। इसमें कोई प्रारंभिक मूल्य नहीं होता है, और एक फ़ंक्शन f:(A,A)=>A
की आवश्यकता होती है। यही है, इसमें दो चीजें होती हैं और एक ही प्रकार में से एक लौटाती है। स्ट्रिंग-मैक्स फ़ंक्शन के साथ एक उदाहरण यहां दिया गया है:
scala> List("Who","is","longest?").reduceLeft((s1,s2) =>
| if (s2.length > s1.length) s2
| else s1
|)
res6: java.lang.String = longest?
अब, केवल दो और चाल हैं।
list.foldLeft(b0)(f)
(b0 /: list)(f)
सूचना कैसे दूसरे में कम है, और यह एक तरह से आप धारणा है कि आप b0
ले जा रहे हैं और इसके साथ सूची में कुछ कर रही है (जो आप कर रहे हैं देता है: सबसे पहले, निम्न दो एक ही बात मतलब)। (:\
foldRight
के रूप में ही है, लेकिन आप तो की तरह उपयोग: (list :\ b0) (f)
दूसरा, अगर आप केवल एक बार एक चर का उल्लेख, आप चर नाम के बजाय _
का उपयोग करें और अज्ञात फ़ंक्शन घोषणा के x =>
भाग को छोड़ सकते हैं ।। यहां दो उदाहरण हैं:, आप कार्यों और नक्शा बनाने के लिए, गुना, और उन्हें स्काला का उपयोग कर को कम इस प्रकार, यदि आप जानते हैं कि कैसे अपने एल्गोरिथ्म काम करना चाहिए सक्षम होना चाहिए
scala> List("How","long","are","we?") map (_.length)
res7: List[Int] = List(3, 4, 3, 3)
scala> (0 /: List("How","long","are","we","all?"))(_ + _.length)
res8: Int = 16
इस बिंदु पर, यह काफी होना चाहिए इसे कार्यान्वित करने के लिए सीधा।
आप एस में हैं टॉम के रूप में एमई कक्षा? Http://stackoverflow.com/questions/2274852/scala-how-to-perform-pattern-matching-with-vararg-case-classes देखें। – huynhjl
यह स्कैला और 'फ़ोल्ड लेफ्ट' के बारे में कोई सवाल नहीं है। यह एल्गोरिदम के बारे में एक सवाल है। आप पूछने से बेहतर होंगे _ "मैं अपरिवर्तनीय डेटा संरचनाओं का उपयोग करके आकृतियों की सूची से सबसे छोटे बाध्यकारी बॉक्स की गणना कैसे करूं?" _। प्रश्न को भाषा-अज्ञेयवादी और एल्गोरिदम के रूप में टैग करें। और शायद कार्यात्मक-प्रोग्रामिंग। यदि आपको स्कैला में सुझाए गए एल्गोरिदम को लागू करने में कोई समस्या है, तो आप इसके बारे में एक स्कैला प्रश्न खोलें। वर्तमान प्रश्न गलत समूह में लक्षित किया जा रहा है। –