۱۰ - ۸خلاصه

مطالب زیادی تو این فصل گفتیم. شاید یه کم از فولدها خسته شده باشین. خلاصه‌ش چیه؟

‏‎foldr‎‏

۱.

مابقیِ فولد (فراخوان ِ بازگشتی ِ ‏‎foldr‎‏) یکی از آرگومان‌های تابع فولدینگ ِه، که خودش از آرگومان‌های ‏‎foldr‎‏ ِه. ‏‎foldr‎‏، برخلافِ ‏‎‎‏foldl خودش رو به عنوانِ آخرین فراخوان صدا نمیزنه. میشه به چشمِ اعمال تناوبی بین ‏‎foldr‎‏ و تابع فولدینگ ِ ‏‎f‎‏ بهش نگاه کرد؛ فراخوان ِ بعدیِ ‏‎foldr‎‏ مشروط به اینه که آیا ‏‎f‎‏ نتیجه‌های بیشتر، حاصل از فولد کردنِ لیست رو درخواست بکنه یا نه. یعنی:

foldr :: (a -> b -> b) -> b -> [a] -> b
--             ^

اون ‏‎b‎‏ در ‏‎(a -> b -> b)‎‏ که بهش اشاره کردیم، همون "مابقیِ فولد" ِه. محاسبه‌ی اون، اعمال ِ بعدیِ ‏‎foldr‎‏ رو محاسبه می‌کنه.

۲.

تابع فولدینگ رو به راست شرکت میده.

۳.

با لیست‌های بینهایت کار می‌کنه. این رو می‌دونیم، چون:

Prelude> foldr const 0 [1..]
1

۴.

برای زمان‌هایی که می‌خواین ساختارهای داده (چه متناهی، چه بینهایت) رو تغییر بدین، گزینه‌ی جامع و خوبیه.

‏‎foldl‎‏

۱.

در طول لیست خودش رو صدا میزنه (به عنوان فراخوانِ نهایی)، و فقط زمانی شروع به تولیدِ مقادیر می‌کنه که به آخر لیست برسه.

۲.

تابع فولدینگ رو به چپ شرکت میده.

۳.

نمیشه ازش با لیست‌های بینهایت استفاده کرد. اگه لیست بینهایت در بخش قبل رو تو REPL تست کنین، گیر می‌کنه.

۴.

تقریباً بی‌فایده‌ست و میشه گفت همیشه باید بجاش از ‏‎foldl'‎‏ استفاده کنین. دلایل‌ش رو وقتی درباره‌ی بازدهی در برنامه‌های هسکل صحبت کنیم توضیح میدیم.