۲ - ۱۱تمرین‌های فصل

هدف کلی از تمرین‌های این فصل اینه که باعث بشه یه کم با کدها بازی کنین و اینکه سعی کنین قبل از اجرا، نتیجه رو پیش‌بینی کنید. کد رو با دقت بخونید، و به کمک مطالبی که تا اینجا خوندیم، یه فرضیه از کاری که فکر می‌کنین کد باید انجام بده درست کنید. با REPL هم بازی کنین و ببینین کجاها فرضیه‌هاتون درست و کجاها غلط بودن.

پرانتزگذاری

با توجه به تقدم توابعِ ‏‎(*)‎‏، ‏‎(+)‎‏، ‏‎(-)‎‏، و ‏‎(^)‎‏، طوری پرانتزگذاری کنید که بیانیه‌های زیر واضح تر بشن ولی نتیجه‌شون تغییری نکنه. اول ذهنی به یه جواب برسین، بعد تو GHCi REPL تست کنید.

مثلاً می‌خوایم این رو کمی واضح‌تر بنویسیم:

2 + 2 * 3 - 3

جواب‌ش با این پرانتزها تغییری نمی‌کنه:

2 + (2 * 3) - 3

همین کار رو برای بیانیه‌های زیر هم انجام بدین:

۱.

2 + 2 * 3 – 3

۲.

(^) 10 $ 1 + 1

۳.

2 ^ 2 * 4 ^ 5 + 1

بیانیه‌های معادل

کدوم یکی از جفت بیانیه‌های زیر جواب یکسان دارن؟ سعی کنید اول ذهنی به جواب برسین بعد تو REPL وارد کنین:

۱.

1 + 1

2

۲.

10 ^ 2

10 + 9 * 10

۳.

400 – 37

(-) 37 400

۴.

100 `div` 3

100 / 3

۵.

2 * 5 + 18

2 * (5 + 18)

تفریح بیشتر با تابع‌ها

کد زیر، به فرض، تو یه فایل نوشته شده. اگه یادتون باشه، ترتیبِ کد تو فایل بی‌اهمیته، ولی وقتی مستقیماً در REPL وارد می‌کنید، ترتیب مهمه. حالا با توجه به این موضوع، کد زیر رو برای تایپ مستقیم در REPL بازنویسی کنید (یادتون باشه که ممکنه نوشتنِ ‏‎let‎‏ لازم باشه). حتماً کدتون رو در REPL تست کنید.

z = 7

x = y ^ 2

waxOn = x * 5

y = z + 8

۱.

حالا که یه مقدار به اسم ‏‎waxOn‎‏ دارین، فکر می‌کنید بیانیه‌های زیر چه جواب‌هایی بدن:

10 + waxOn

(+10) waxOn

(-) 15 waxOn

(-) waxOn 15

۲.

قبل‌تر یه تابع به اسم ‏‎triple‎‏ داشتیم. همینطور که ‏‎waxOn‎‏ رو در گستره‌ی REPL دارین، دوباره ‏‎triple‎‏ رو تعریف کنین:

let triple x = x * 3

۳.

فکر می‌کنین نتیجه‌ی کد زیر در GHCi چی باشه؟ نقش ‏‎waxOn‎‏ اینجا چیه؟ اول سعی کنید به جواب برسین بعد با REPL چک کنید و مطمئن بشین که دلیل جواب نهایی‌ش رو کامل درک می‌کنین:

triple waxOn

۴.

توی فایل‌تون، ‏‎waxOn‎‏ رو با ‏‎where‎‏ بازنویسی کنین و مطمئن بشین همون نتیجه‌ی قبلی رو می‌گیرین.

۵.

توی فایلی که ‏‎waxOn‎‏ رو تعریف کرده بودین، تابع ‏‎triple‎‏ هم اضافه کنید. یادتون باشه که ‏‎let‎‏ لازم نیست، و اسم تابع رو سمت چپ بذارین (یعنی با توگذاری زیرمجموعه‌ی ‏‎waxOn‎‏ نشه). تو REPL بارگذاری کنید و با ‏‎triple waxOn‎‏ تست کنید. جوابتون باید با جواب بالا یکسان بشه.

۶.

حالا بدون اینکه تغییری به اون فایل بدین، تابع ‏‎waxOff‎‏ رو هم به فایل اضافه کنید:

waxOff x = triple x

۷.

فایل رو در REPL بارگذاری کنید و تو prompt تایپ کنید: ‏‎waxOff waxOn‎‏.

می‌تونین تابع ‏‎waxOff‎‏ رو نه فقط به ‏‎waxOn‎‏، بلکه به هر مقدارِ عددی دیگه‌ای اعمال کنید. می‌تونین یه کم باهاش بازی کنین. جواب ‏‎waxOff 10‎‏ یا ‏‎waxOff (-50)‎‏ چی میشه؟ تابع ‏‎waxOff‎‏ ِتون رو تغییر بدین تا یه کار دیگه انجام بده، مثلاً بعد از سه برابر کردنِ ‏‎x‎‏ مجذورش رو برگردونه، یا به ۱۰ تقسیم کنه. کمی وقت بذارین تا با تغییر کدتون و بارگذاری مجدد کردنِش در REPL راحت بشین، و نتیجه‌ی تغییرات‌تون رو هم ببینین.