मैंने सुना है कि अधिकतर परिचालनों में फोल्ड लाइफ्ट अधिक कुशल है, लेकिन स्कैला स्कूल (ट्विटर से) ने निम्नलिखित उदाहरण दिया है। क्या कोई अपनी दक्षता का विश्लेषण कर सकता है और क्या हमें foldLeft का उपयोग करके एक ही ऑपरेशन प्राप्त करना चाहिए?foldRight क्षमता?
val numbers = List(1,2,3,4,5,...10)
def ourMap(numbers: List[Int], fn: Int => Int): List[Int] = {
numbers.foldRight(List[Int]()) { (x: Int, xs: List[Int]) =>
fn(x) :: xs
}
}
scala> ourMap(numbers, timesTwo(_))
res0: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
क्या मैं अंतिम विवरण के बारे में आपके उत्तर को स्पष्ट कर सकता हूं? यह मामला नहीं है कि फ़ोल्डराइट आमतौर पर फोल्ड लेफ्ट की तुलना में 10% -40% तेज होता है, लेकिन जब एक रिवर्स ऑपरेशन शामिल होता है तो इस अंतर की अपेक्षा की जाती है। बाएं या दाएं गुना के बीच चयन करते समय, दाएं गुना के लिए आवश्यक स्टैक फ्रेम की संभावित रूप से उच्च लागत की आवश्यकता होती है, लेकिन रिवर्स के साथ एक फोल्ड लेफ्ट का उपयोग करने के विपरीत रिवर्स गणना की उच्च लागत होती है। यदि FoldLeft (रिवर्स के बिना) एक विकल्प है, तो यह समग्र रूप से बेहतर विकल्प प्रतीत होता है। –
नोट, मेरा मानना है कि 'लिस्ट' की' फ़ोल्ड राइट 'स्कैला के हाल के संस्करणों में बस बाएं गुना + रिवर्स है, शायद स्टैक ओवरफ्लो से बचने के लिए –