एकाधिक पैरामीटर सूची के तरीके
टाइप इंट्रेंस के लिए
पहले प्रकार के तर्कों के लिए पहले खंड में मापदंडों का उपयोग करके स्थानीय प्रकार की निष्कासन की सहायता के लिए कई पैरामीटर अनुभागों के साथ तरीकों का उपयोग किया जा सकता है जो बाद के अनुभाग में एक तर्क के लिए एक अपेक्षित प्रकार प्रदान करेगा। foldLeft
मानक पुस्तकालय में इस का विहित उदाहरण है।
def foldLeft[B](z: B)(op: (B, A) => B): B
List("").foldLeft(0)(_ + _.length)
यदि यह इस रूप में लिखा गया था:
def foldLeft[B](z: B, op: (B, A) => B): B
एक को अधिक स्पष्ट प्रकार प्रदान करने होंगे:
List("").foldLeft(0, (b: Int, a: String) => a + b.length)
List("").foldLeft[Int](0, _ + _.length)
धाराप्रवाह एपीआई के लिए
एकाधिक पैरामीटर अनुभाग विधियों के लिए एक और उपयोग एक एपीआई बनाने के लिए है जो भाषा निर्माण की तरह दिखता है। कॉलर कोष्ठक के बजाय ब्रेसिज़ का उपयोग कर सकता है।
def loop[A](n: Int)(body: => A): Unit = (0 until n) foreach (n => body)
loop(2) {
println("hello!")
}
N तर्क सूचियों का अनुप्रयोग M पैरामीटर अनुभागों के साथ विधि के लिए, जहां N <M, को एक _
प्रकार के साथ या अनुमानित रूप से स्पष्ट रूप से एक फ़ंक्शन में परिवर्तित किया जा सकता है FunctionN[..]
। यह एक सुरक्षा सुविधा है, स्कैला संदर्भ में, स्कैला 2.0 के लिए, पृष्ठभूमि के लिए, परिवर्तन नोट देखें।
करी क्रिया
करी कार्यों (या बस, फ़ंक्शन जो फ़ंक्शंस लौटाते हैं) को एन तर्क सूचियों में अधिक आसानी से लागू किया जाता है।
val f = (a: Int) => (b: Int) => (c: Int) => a + b + c
val g = f(1)(2)
यह मामूली सुविधा कभी-कभी सार्थक होती है। ध्यान दें कि फ़ंक्शंस टाइप पैरामीट्रिक नहीं हो सकते हैं, इसलिए कुछ मामलों में एक विधि की आवश्यकता होती है।
आपका दूसरा उदाहरण एक हाइब्रिड है: एक पैरामीटर पैरामीटर विधि जो एक फ़ंक्शन लौटाती है।
मल्टी स्टेज कम्प्यूटेशन
अन्य उपयोगी कार्य कहाँ हैं? यहाँ एक पैटर्न है जो हर समय आता है:
def v(t: Double, k: Double): Double = {
val ft = f(t)
g(ft, k)
}
v(1, 1); v(1, 2);
हम परिणाम कैसे साझा कर सकते हैं f(t)
? इसका एक सामान्य समाधान एक सदिश संस्करण प्रदान करना है v
:
def v(t: Double, ks: Seq[Double]: Seq[Double] = {
val ft = f(t)
ks map {k => g(ft, k)}
}
बदसूरत! हमने असंबंधित चिंताओं को उलझा दिया है - g(f(t), k)
एक अनुक्रम में गणना और मानचित्रण ks
।
val v = { (t: Double) =>
val ft = f(t)
(k: Double) => g(ft, k)
}
val t = 1
val ks = Seq(1, 2)
val vs = ks map (v(t))
हम एक विधि का उपयोग भी कर सकते हैं जो एक फ़ंक्शन देता है। इस मामले में इसकी थोड़ी अधिक पठनीय:
def v(t:Double): Double => Double = {
val ft = f(t)
(k: Double) => g(ft, k)
}
लेकिन अगर हम कई पैरामीटर सेक्शन वाली विधि के साथ भी ऐसा करने की कोशिश करते हैं, तो हम अटक जाते हैं:
def v(t: Double)(k: Double): Double = {
^
`-- Can't insert computation here!
}