۲ - ۵محاسبه

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

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

مقادیر بیانیه‌اند، ولی ساده‌تر نمیشن. یعنی مقادیر نقطه‌ی پایانیِ ساده‌سازی‌اند:

1
"Icarus"

بیانیه‌های زیر رو میشه به یه مقدار ساده کرد:

1 + 1
2 * 3 + 1

هر کدوم رو میشه توی REPL محاسبه کرد. REPL اول ساده‌شون می‌کنه، و بعد نتیجه‌شون رو چاپ می‌کنه.

برگردیم به تابعِ ‏‎triple‎‏. وقتی تابع رو با یه آرگومان صدا میزنیم، در واقع یه بیانیه داریم که میشه ساده‌تَرِش کرد. در یک زبانِ تابعیِ خالص مثل هسکل، می‌تونیم توابعِ اعمال‌شده رو با تعریفِ‌شون جابجا کنیم و همون جواب رو بگیریم؛ مثل ریاضی. پس وقتی جمله‌ی زیر رو می‌بینیم:

triple 2

میدونیم بیانیه‌های زیر باهاش معادل‌اند:

triple 2
-- [triple x = x * 3; x := 2]
2 * 3
6

تابع ‏‎triple‎‏ رو به عدد ۲ اعمال کردیم و بعد به جوابِ نهایی، یعنی ۶، ساده‌ش کردیم. حالت معمولی ِ بیانیه‌ی ‏‎triple 2‎‏، عدد ۶ ِه، چون ساده‌تر نمیشه.

هسکل به طور پیش‌فرض همه‌ی بیانه‌ها رو تا حالت معمولی‌شون حساب نمی‌کنه، بلکه فقط تا حالت معمولی با سرِ ضعیف ‌(WHNF) پیش میره. یعنی هر چیزی بلافاصله تا آخر ساده نمیشه. برای مثال، جمله‌ی زیر:

(\f -> (1, 2 + f)) 2

در WHNF به جمله‌ی زیر ساده میشه:

(1, 2 + 2)

این یه ارائه‌ی تقریبی‌ه، ولی نکته اینجاست که ‏‎2 + 2‎‏ تا آخرین لحظه‌ی ممکن به ۴ ساده نمیشه.

تمرین‌ها: بررسی ادراک

۱.

کدهای زیر توی یه فایل نوشته شدن. اگه بخواین این توابع رو مستقیماً توی REPL بنویسین، چه تغییراتی باید بدین؟

half x = x / 2

square x = x * x

۲.

یه تابع با یک پارامتر بنویسین که به جای همه‌ی بیانیه‌های زیر کار کنه. براش اسم هم بذارین.

3.14 * (5 * 5)
3.14 * (10 * 10)
3.14 * (2 * 2)
3.14 * (4 * 4)

۳.

یک مقدار به اسمِ ‏‎pi‎‏ در ‏‎Prelude‎‏ وجود داره. تابع‌تون رو با این ‏‎pi‎‏ به جای ۳٫۱۴ بازنویسی کنید.