একাধিক পরামিতি তালিকা পদ্ধতি
প্রকার অনুমানের জন্য
একাধিক প্যারামিটার বিভাগ সহ পদ্ধতিগুলি স্থানীয় ধরণের অনুমিতিতে সহায়তা করতে ব্যবহৃত হতে পারে, প্রথম বিভাগে পরামিতি ব্যবহার করে টাইপ আর্গুমেন্টগুলি অনুমান করা যায় যা পরবর্তী বিভাগে একটি আর্গুমেন্টের জন্য একটি প্রত্যাশিত প্রকার সরবরাহ করবে। 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)
সাবলীল এপিআই এর জন্য
একাধিক পরামিতি বিভাগের পদ্ধতিগুলির জন্য আরেকটি ব্যবহার হ'ল একটি ভাষা তৈরির মতো দেখতে এমন একটি API তৈরি করা। কলার বন্ধনীগুলির পরিবর্তে ব্রেস ব্যবহার করতে পারে।
def loop[A](n: Int)(body: => A): Unit = (0 until n) foreach (n => body)
loop(2) {
println("hello!")
}
এন আর্গুমেন্টের প্রয়োগ এম প্যারামিটার বিভাগগুলির সাথে পদ্ধতিতে তালিকাবদ্ধ করে, যেখানে এন <এম, _
একটি প্রত্যাশিত প্রকারের সাথে একটি বা স্পষ্টতই স্পষ্টভাবে কোনও ফাংশনে রূপান্তরিত হতে পারে FunctionN[..]
। এটি একটি সুরক্ষা বৈশিষ্ট্য, একটি ব্যাকগ্রাউন্ডের জন্য স্কালা রেফারেন্সগুলিতে স্কালার ২.০ এর পরিবর্তনের নোটগুলি দেখুন।
ত্রিযুক্ত ফাংশন
ত্রিযুক্ত ফাংশন (বা সহজভাবে, ফাংশনগুলি ফিরিয়ে দেয়) আরও সহজে এন যুক্তির তালিকায় প্রয়োগ করা হয়।
val f = (a: Int) => (b: Int) => (c: Int) => a + b + c
val g = f(1)(2)
এই সামান্য সুবিধাটি কখনও কখনও সার্থক হয়। নোট করুন যে ফাংশনগুলি যদিও প্যারামেট্রিক টাইপ করা যায় না, তাই কিছু ক্ষেত্রে একটি পদ্ধতি প্রয়োজন।
আপনার দ্বিতীয় উদাহরণটি একটি সংকর: একটি প্যারামিটার বিভাগ পদ্ধতি যা কোনও ফাংশন দেয় returns
মাল্টি স্টেজ গণনা
আর কোথায় ত্রিযুক্ত ফাংশন দরকারী? এখানে একটি নিদর্শন যা সর্বদা উঠে আসে:
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!
}