بهترین روش‌ها برای کار با مثال‌ها و تمرین‌ها

ما سعی کردیم در هر فصل، مثال‌ها و تمرین‌های متنوعی آورده باشیم. با اینکه همه‌ی تلاش‌مون رو کردیم تا آموزنده‌ترین تمرین‌ها رو بنویسیم، متوجه هستیم که شاید بعضی تمرین‌ها برای بعضی‌ها جذابیت نداشته باشن. و با توجه به اینکه خواننده‌های این کتاب با پیش‌زمینه‌های متنوعی میان، بعضی تمرین‌ها یا به نظر خیلی آسون میان یا به نظر خیلی سخت، و احتمالاً همون تمرین‌ها برای یه سری دیگه از خواننده‌ها کاملاً مناسب باشن. سعی کنین بیشترین تمرین‌هایی که برای شما مناسب هستن رو حل کنین. ولی اگه مثلاً همه‌ی تمرین‌های تایپ و تایپکلاس‌ها رو رَد کرده بودین و سرِ مانویدها یه کم سردرگم شدین، برگردین و انقدر تمرین کنین تا یاد بگیرین.

اینها رو به خاطر داشته باشین تا از تمرین‌ها بیشترین بهره رو ببرین:

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

  • قراره همه‌ی مثال‌ها رو تویِ REPL یا یه فایل، تایپ و تست کنین. به شدت توصیه می‌کنیم بعد از اینکه کدِتون کار کرد، سعی کنین تغییرِش بدین و یه کم باهاش بازی کنین. این که یه فرضیه‌ای از نتیجه‌ی تغییرات‌تون بدین و بعد ببینین درست بوده یا نه، واقعاً مهمه! و اگه خودتون تایپ کنین (یعنی کپی/پیست نکنین) خیلی بهتره، چون باعث میشه بیشتر به کدها توجه کنین.

  • بعضی مثال‌ها عمداً کار نمی‌کنن، ولی حتماً تویِ متن چیزی از خرابی‌شون نوشته شده. اگه خطای غیرمنتظره‌ای گرفتین که ما هم چیزی ازش نگفتیم، کدتون رو چک کنین تا خطای گرامری نداشته باشین.

  • همه‌ی مثال‌ها برای تایپ در REPL طراحی نشدن؛ همه‌ی مثال‌ها برای نوشتن تویِ یه فایل هم طراحی نشدن. بعد از توضیحِ تفاوت‌های گرامری بینِ بیانیه‌ها در REPL و در فایل، انتظار میره که خودتون کدها رو از یکی به اون یکی منتقل کنین. تا انتهای کتاب دیگه باید خیلی راحت با کد کار کنین. بهتره که خورده‌خورده بجای نوشتنِ مثال‌ها و تمرین‌ها توی GHCi، سعی کنین به کار کردن با فایل‌های منبع عادت کنین (البته به جز موردهای خاص). ویرایش و تغییر کد در یه فایلِ منبع خیلی آسون‌تر و عملی‌تره. بعد هم کدِتون رو توی GHCi بارگذاری و اجرا می‌کنین.

  • بهتره که تمرین‌ها، بخصوص تمرین‌های طولانی‌تر رو به عنوانِ ماژول‌های اسم‌دار ذخیره کنین. تمرین‌های خیلی زیادی هستن که بارها بهشون برمی‌گردیم (مخصوصاً آخرهای کتاب)، پس قابلیتِ بارگذاریِ مجددِ اونها، جلوی کدنویسیِ تکراری رو می‌گیره. سعی کردیم تو تمرین‌هایی که این کار لازمه، یه اشاره‌ای کرده باشیم.

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

  • حتی تمرین‌هایی که به نظر آسون میان، به رَوون شدن در یه مبحث کمک می‌کنن. ما سختی رو به خاطرِ صرفاً سخت بودن تأیید نمی‌کنیم. فقط می‌خوایم تا میشه مطالب رو خوب درک کنین. برای همین ممکنه لازم بشه یک مسئله رو از چند زاویه بیان کنیم.

  • ازتون خواستیم که خیلی از تابع‌ها رو بازنویسی کنین (با گرامرهای متفاوت). مسائلِ خیلی کمی هستن که فقط یه راهِ حل دارن، و حلِ یک مسئله از راه‌های مختلف به تسلط و راحتی‌تون با طرزِ کار هسکل (گرامرِش، مفاهیم‌ش، و در بعضی موارد، ترتیبِ محاسبات‌ش) کمک می‌کنه.

  • خودتون رو به حلِ همه‌ی تمرین‌ها در مطالعه‌ی اولِ یه فصل ملزم نکنین. تکرارهای با فاصله تأثیرِ بیشتری دارن.

  • بعضی تمرین‌ها، بخصوص در فصل‌های اول، ممکنه به نظر زورَکی یا ساختگی بیان. رُک بگیم، همینطور هم هستن. ولی به این دلیل ساختگی‌اند تا موضوع‌های بخصوصی رو درس بدن. همین که پیش میرین و بیشتر هسکل یاد می‌گیرین، تمرین‌ها یه کم از اون ساختگی بودن دور میشن و به "هسکلِ واقعی" نزدیک‌تر میشن.

  • یکی دیگه از مزایای کدنویسی توی فایلِ منبع و بعد بارگذاری‌ش توی REPL اینه که می‌تونین در رابطه با فرایندی که سپری کردین تا به جواب رسیدین، کامِنت بنویسین. نوشتنِ افکارِتون در راهِ رسیدن به جواب، به شفاف شدنِ افکارِتون و حلِ مسائل مشابه کمک می‌کنه. حداقل‌ش اینه که بعداً با خوندنِ کامنت‌هاتون یه چیزهایی از خودتون یاد می‌گیرین.

  • بعضی وقت‌ها عمداً تعریفِ یه تابع رو ناقص می‌نویسیم. چیزهایی مثل این زیاد می‌بینین:

    f = undefined
    --  ^-------^
    -- م. تعریف نشده

    با اینکه به احتمالِ زیاد ‏‎f‎‏ چندتا آرگومان هم می‌گیره، ولی ما پارامترهاش رو براتون نامگذاری نمی‌کنیم. موقعِ نوشتنِ پروژه‌های خودتون، کسی نیست دست‌تون رو بگیره، پس انتظار نداشته باشین که این کتاب هم این کار رو کنه.