۲۶ - ۱تنبلی

موضوع این فصل، نحوه‌ی محاسبه‌ی برنامه‌ها در هسکل‌ه. در فصل‌های قبلی هم کمی به این مورد اشاره کردیم، مثلاً در فصل فولدها کمی از جزئیاتِ طریقه‌ی محاسبه‌ی فولدها توضیح دادیم. هدف ما تو این فصل اینه که انقدر شما رو با استراتژیِ محاسبه در هسکل آشنا کنیم که با اطمینان، فرایندِ محاسبات رو استدلال کنین و در صورت نیاز، محاسبات اکیدتری پیاده کنین.

بیشتر زبان‌های برنامه‌نویسی محاسبه‌ی اکید دارن. محاسبه‌ی هسکل اصولاً نااَکید ِه (نه تنبل اما تفاوت بین تنبل و نااکید عملاً بی‌اهمیت‌ه، در نتیجه به محاسبه‌ی هسکل، هم تنبل میگن هم نااکید.

استراتژیِ محاسبه در هسکل رو بطور خیلی کلی میشه اینطوری توصیف کرد: بیشتر بیانیه‌ها زمانی ساده یا محاسبه میشن که لازم باشه. وقتی فرایند محاسبه شروع میشه، یه ثانک به ازای هر بیانیه درست میشه. در طول فصل بیشتر توضیح میدیم، اما ثانک مثل یه جاگیر در نمودار یا گراف ِ زیرین برنامه می‌مونه. هروقت بیانیه‌ای که ثانک براش جا گرفته لازم بشه، محاسبه میشه، اما اگه هیچ وقت لازم نشه، هیچ وقت هم ساده نمیشه، بعد زباله‌روب میاد و جمع‌ش می‌کنه. اگه محاسبه بشه، به خاطر اینکه توی یه گراف ِه، عموماً قابلیتِ به اشتراک گذاشته شدن بین بیانیه‌ها رو هم داره – یعنی یک بار که ‏‎x = 1 + 1‎‏ محاسبه بشه، دیگه لازم نیست در صورت اجبار شدن، ‏‎x‎‏ دوباره محاسبه بشه.

این تنبلی ِ هسکل‌ه: بیشتر از اونیکه لازمه کار نکن. تا واجب نبود محاسبه نکن. اگه مجبور نیستی، چیزی رو دوباره محاسبه نکن. جزئیات طرزِ کارِش، حالت‌های استثنا نسبت به قواعد کلی، و نحوه‌ی کنترل محاسبات از طریق اضافه کردنِ اکید بودن در جاهای مطلوب رو توضیح میدیم.

مشخصاً این موارد رو پوشش میدیم:

  • محاسباتِ فراخوان-با-اسم و فراخوان-برحسب-نیاز رو تعریف می‌کنیم؛

  • اثرات اصلیِ محاسبه‌ی نااکید رو توضیح میدیم؛

  • ثانک‌ها رو بیشتر می‌شناسیم؛

  • رفتار زمانِ‌اجرا ِ کدِ نااکید رو در خصوصِ به اشتراک‌گذاری بررسی می‌کنیم؛

  • متودهایی برای مشاهده‌ی رفتارِ اشتراک‌گذاری و اندازه‌گیریِ بازدهی ِ برنامه درست می‌کنیم؛

  • تَهِ تُهی رو درمیاریم.