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