۱۵ - ۷خوب که چی؟

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

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

یه مثال از مواقعی که چیزی مثل مقدارِ همانی ممکنه کاربرد داشته باشه، نوشتن یه کتابخونه ِ جامع برای پیاده‌سازی کارها به صورتِ موازی ِه. میشه کار رو مثل یه درخت توصیف کرد که هر واحدِ کاری یه برگ باشه. از اون نقطه میشه درخت رو به هر چندتا تیکه‌ای که لازمه تا همه‌ی هسته‌های پردازنده، یا همه‌ی کامپیوترهای کارگر اشباع بشن تقسیم کرد. با این توصیف، اگه یه عملیات ِ جفتی داشته باشیم و بخوایم یه تعدادِ فرد از برگها رو با هم ترکیب کنیم، چطور میشه تعدادِ برگها رو زوج کرد؟

یک راهِ سرراست اینه که یه ‏‎mempty‎‏ (یه مقدار همانی) به برگهای فرد بدیم تا جواب‌مون تغییری نکنه و به لایه‌ی بعدی در انبوهش پاسِ‌ش بدیم!

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

مانویدها با فولدینگ یا کاتامورفیسم هم رابطه‌ی خیلی نزدیکی دارن – کاری که تو هسکل دائماً انجام میدیم. در فصلِ ‏‎Foldable‎‏ بیشتر توضیح میدیم، اما این زیر هم چندتا مثال آوردیم:

λ> foldr mappend mempty ([2,4,6] :: [Product Int])
Product {getProduct = 48}

λ> foldr mappend mempty ([2,4,6] :: [Sum Int])
Sum {getSum = 12}

λ> foldr mappend mempty ["blah", "woot"]
"blahwoot"

وقتی ‏‎Applicative‎‏ و ‏‎Monad‎‏ رو توضیح بدیم، باز هم ساختار مانویدی رو می‌بینین.