कड़ाई से बोलना, यह एक क्यूरेटेड फ़ंक्शन नहीं है, लेकिन कई तर्क सूचियों के साथ एक विधि है, हालांकि माना जाता है कि यह एक फ़ंक्शन की तरह दिखता है।
जैसा कि आपने कहा, कई तर्क सूची आंशिक रूप से लागू फ़ंक्शन के स्थान पर विधि का उपयोग करने की अनुमति देती है। (आमतौर पर मूर्खतापूर्ण उदाहरणों के लिए क्षमा करें जो मैं उपयोग करता हूं)
object NonCurr {
def tabulate[A](n: Int, fun: Int => A) = IndexedSeq.tabulate(n)(fun)
}
NonCurr.tabulate[Double](10, _)
val x = IndexedSeq.tabulate[Double](10) _
x(math.exp(_))
एक और लाभ यह है कि आप कोष्ठक के बजाय घुंघराले ब्रेसिज़ का उपयोग कर सकते हैं जो अच्छा लगता है यदि दूसरी तर्क सूची में एकल फ़ंक्शन या थंक शामिल हैं। उदाहरण के लिए
NonCurr.tabulate(10, { i => val j = util.Random.nextInt(i + 1); i - i % 2 })
बनाम
IndexedSeq.tabulate(10) { i =>
val j = util.Random.nextInt(i + 1)
i - i % 2
}
या ठग के लिए:
IndexedSeq.fill(10) {
println("debug: operating the random number generator")
util.Random.nextInt(99)
}
एक और लाभ यह है, आप डिफ़ॉल्ट तर्क मानों को परिभाषित करने के लिए पिछली तर्क सूची के तर्कों का उल्लेख कर सकते हैं (हालांकि आप यह भी कह सकते हैं कि यह एक नुकसान है कि आप एकल सूची में ऐसा नहीं कर सकते :)
def doSomething(f: java.io.File)(modDate: Long = f.lastModified) = ???
अंत में, संबंधित पोस्ट के जवाब में तीन अन्य एप्लिकेशन हैं। स्काला प्रत्येक सूची में कई पैरामीटर सूची और कई पैरामीटर क्यों प्रदान करता है? । मैं बस उन्हें यहां कॉपी करूंगा, लेकिन इसका श्रेय नॉट अर्ने वेदा, केविन राइट और एक्सपेम्पोर को जाता है।
पहला: आपके पास कई var args हो सकते हैं:
def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum
... जो एकल तर्क सूची में संभव नहीं होगा।
दूसरा, यह प्रकार का अनुमान लगाता है:
def foo[T](a: T, b: T)(op: (T,T) => T) = op(a, b)
foo(1, 2){_ + _}
def foo2[T](a: T, b: T, op: (T,T) => T) = op(a, b)
foo2(1, 2, _ + _)
और अंतिम, यह एकमात्र तरीका है जिसमें आपके पास अंतर्निहित और गैर-निहित आर्ग हो सकते हैं, जैसा implicit
कि संपूर्ण तर्क सूची के लिए एक संशोधक है:
def gaga [A](x: A)(implicit mf: Manifest[A]) = ???
def gaga2[A](x: A, implicit mf: Manifest[A]) = ???