আসল উত্তর দেওয়ার আগে এখানে কয়েকটি বিষয় উল্লেখ করতে হবে:
- আপনার প্রশ্নের সাথে কিছু করার নেই
left
, এটি হ্রাস এবং ভাঁজ মধ্যে পার্থক্য সম্পর্কে
- পার্থক্যটি মোটেও বাস্তবায়ন নয়, কেবল স্বাক্ষরগুলি দেখুন।
- বিশেষত স্কালার সাথে প্রশ্নের কিছু করার নেই, এটি কার্যকরী প্রোগ্রামিংয়ের দুটি ধারণা সম্পর্কে con
আপনার প্রশ্নে ফিরে:
এখানে স্বাক্ষরটি foldLeft
( foldRight
আমি যে পয়েন্টটি করতে যাচ্ছি তার জন্যও এটি হতে পারে):
def foldLeft [B] (z: B)(f: (B, A) => B): B
এবং এখানে স্বাক্ষর reduceLeft
(আবার দিকটি এখানে গুরুত্বপূর্ণ নয়)
def reduceLeft [B >: A] (f: (B, A) => B): B
এই দুটি দেখতে খুব অনুরূপ এবং এই কারণেই বিভ্রান্তির সৃষ্টি হয়েছিল। reduceLeft
এটির একটি বিশেষ কেস foldLeft
(যার অর্থ এই যে আপনি মাঝে মাঝে উভয়টি ব্যবহার করে একই জিনিসটি প্রকাশ করতে পারেন)।
আপনি কল যখন reduceLeft
একটি বলার List[Int]
এটা আক্ষরিক একটি একক মান, যা ধরনের হতে যাচ্ছে মধ্যে পূর্ণসংখ্যার পুরো তালিকা কমবে Int
(অথবা একটি supertype Int
, অত [B >: A]
)।
আপনি কল যখন foldLeft
একটি বলার List[Int]
এটা (এক টুকরা কাগজ ঘূর্ণায়মান কল্পনা) পুরো তালিকা ভাঁজ হবে একটি একক মান মধ্যে, কিন্তু এই মানটি এর সাথে সম্পর্কিত করা হবে তা নয় Int
(অত: পর [B]
)।
এখানে একটি উদাহরণ:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
এই পদ্ধতিটি একটি নেয় List[Int]
এবং একটি Tuple2[List[Int], Int]
বা প্রদান করে (List[Int], Int)
। এটি যোগফল গণনা করে এবং পূর্ণসংখ্যার তালিকার সাথে একটি টিপল দেয় এবং এর যোগফল। যাইহোক তালিকাটি পিছনে ফিরে আসে, কারণ আমরা foldLeft
পরিবর্তে ব্যবহার করি foldRight
।
আরও গভীরতার ব্যাখ্যার জন্য তাদের সমস্তকে শাসন করতে ওয়ান ভাঁজ দেখুন ।