۱۸ - ۸تعاریف

۱.

موند یا monad تایپکلاسی‌ه که یه حالت خاص از یک انتزاع ِ جامع رو در هسکل پیاده‌سازی می‌کنه. متود ِ اصلیِ این تایپکلاس، بجای یه تابعِ معمولی از ‏‎a‎‏ به ‏‎b‎‏، یه تابع که در جوابش باز هم ساختار تولید می‌کنه رو به صورتِ فانکتوری اعمال می‌کنه و با استفاده از ‏‎join‎‏ ساختار‌های تودرتو رو کاهش میده.

fmap ::    (a -> b)   -> f a -> f b

(<*>) :: f (a -> b)   -> f a -> f b

(=<<) ::   (a -> f b) -> f a -> f b

۲.

تابع موندی یا monadic function، تابعی‌ه که بعد از لیفت شدن از روی ساختار موندی، ساختار ِ بیشتری درست می‌کنه. آرگومان‌های تابعی در ‏‎fmap‎‏ و ‏‎(>>=)‎‏ رو با هم مقایسه کنین:

fmap :: (a -> b) -> f a -> f b

(>>=) ::  m a -> (a -> m b) -> m b

تفاوت اصلی اینجاست که جوابِ اون تابع در ‏‎(>>=)‎‏ از تایپِ ‏‎m b‎‏ ِه و بعد از لیفت شدن از روی ‏‎m‎‏ نیاز به ‏‎join‎‏ شدن داره. این یعنی چی؟ بستگی به نمونه ِ ‏‎Monad‎‏ داره.

این تمایز در ترکیب تابع ِ معمولیِ و ترکیبِ کلایزلی هم قابلِ مشاهده‌ست:

(.)
  :: (b ->   c) -> (a ->   b) -> a ->   c

(>=>)
  :: Monad m
  => (a -> m b) -> (b -> m c) -> a -> m c

۳.

انقیاد یا bind لغتی‌ه که متأسفانه به چیزهای زیادی اطلاق میشه. اولین بار اوایلِ کتاب برای انقیاد ِ متغیرها به مقادیر ازش استفاده کردیم. مثل زیر:

let x = 2 in x + 2

تو این مثال ‏‎x‎‏ یه متغیره که به ۲ مقیّد شده. اما وقتی از نمونه ِ ‏‎Monad‎‏ حرف می‌زنیم، معمولاً از لغتِ بایند برای اشاره به تابعِ ‏‎>>=‎‏ برای لیفت‌کردن ِ یه تابعِ موندی از روی ساختار استفاده می‌کنیم. فرق‌شون هم اینجاست که:

-- f a در f از روی (a -> b) لیفتِ
fmap :: (a -> b) -> f a -> f b

-- m a در m از روی (a -> m b) بایندِ
(>>=) :: m a -> (a -> m b) -> m b

بعضی اوقات به انقیاد در گرامر ِ ‏‎do‎‏ هم میگیم "بایند از روی." در اون مواقع هم منظورمون اینه که یه تابع موندی رو لیفت می‌کنیم و بعد از اینکه کارمون با ‏‎Monad‎‏ تموم شه با ‏‎join‎‏ ساختار ِش رو دوباره لِه می‌کنیم.