۲ - ۱۱تمرینهای فصل
هدف کلی از تمرینهای این فصل اینه که باعث بشه یه کم با کدها بازی کنین و اینکه سعی کنین قبل از اجرا، نتیجه رو پیشبینی کنید. کد رو با دقت بخونید، و به کمک مطالبی که تا اینجا خوندیم، یه فرضیه از کاری که فکر میکنین کد باید انجام بده درست کنید. با 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 راحت بشین، و نتیجهی تغییراتتون رو هم ببینین.