۱۶ - ۱فانکتور

در فصل قبل منظورمون از یک جبر رو گفتیم و دیدیم چطور میشه اون رو به یه تایپکلاس تبدیل کرد. تو این فصل، و دو فصل بعدی هم درباره‌ی ‏‎Applicative‎‏ و ‏‎Monad‎‏ روند مشابهی رو پیش می‌گیریم. هر جبر از جبر ِ قبلی‌ش قوی‌تره، اما ایده‌ی کلی تغییری نمی‌کنه: یه الگوی مشترک رو انتزاعی می‌کنیم، تضمین می‌کنیم از چندتا قانون پیروی کنه، یه اسم باحال بهش میدیم، و بعد در حیرت به سر می‌بریم که تا الان چطور بدون اون زندگی می‌کردیم. میشه گفت اصل داستان ‏‎Monad‎‏ ِه، اما با ‏‎Functor‎‏ و ‏‎Applicative‎‏ کارهای زیادی میشه انجام داد، بیشتر از اونی که اکثراً فکر می‌کنن. از طرف دیگه درکِ ‏‎Functor‎‏ و ‏‎Applicative‎‏ برای درک عمیق از ‏‎Monad‎‏ خیلی مهمه.

این فصل فقط راجع به ‏‎Functor‎‏ ِه، ‏‎Functor‎‏ هم همه‌ش راجع به یه الگوی کلی برای نگاشت از روی یه ساختاره. خیلی وقت پیش تو فصلِ لیست‌ها ‏‎fmap‎‏ رو که نشون دادیم، گفتیم عینِ ‏‎map‎‏ کار می‌کنه، یه چیز دیگه هم که گفتیم این بود که ‏‎fmap‎‏ رو میشه برای ساختارهای غیر از لیست هم استفاده کرد. حالا ببینیم منظورمون چی بوده.

ظاهراً اولین کسی که از لغت فانکتور استفاده کرده، منطق‌دانِ بزرگ رودولف کارنَپ، در دهه‌ی ۱۹۳۰ بوده. این لغت رو برای توصیف تابع‌لغت‌های گرامری و عملیات‌های روی جملات یا عبارات اختراع کرد. فانکتورها ترکیب‌کننده‌اند: یک جمله یا عبارت رو به عنوان ورودی می‌گیرن و بعد از اعمال چندتا عملیات منطقی، یه جمله یا عبارت رو خروجی میدن. برای مثال نقیض یه فانکتور ِه، چون وقتی نقیض به یه جمله‌ی ‏‎A‎‏ اعمال میشه، نسخه‌ی نقض‌ش، یعنی ‏‎¬A‎‏ رو تولید می‌کنه. مفهوم نقیض رو روی کلِ جمله لیفت می‌کنه (یا بلند می‌کنه) بدون اینکه ساختار داخلی‌ش رو تغییری بده (درسته که در زبان‌های طبیعی، عاملِ نقیض – مثل not در انگلیسی و حرف "ن" در فارسی – وسط جمله‌ها ظاهر میشن و نه بیرون‌شون، اما ایشون منطق‌دان بودن و خودشون رو درگیرِ چیزای به این سطح پایینی مثل زبان کلامی نمی‌کردن. در منطق، اوپراتورِ نقیض معمولاً پیشوندی نوشته میشه).

این فصل شامل:

  • بازگشتِ تایپ‌های گونه‌بالا؛

  • وفورِ ‏‎fmap‎‏، نه فقط روی لیست‌ها؛

  • عدم حاشیه‌رویِ بیشتر راجع به منطق‌دان‌های قدیمی؛

  • لغات مرتبط با تایپکلاس‌ها و کلاس‌های سازنده.