۱۸ - ۸تعاریف
۱.
موند یا 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
ساختار ِش رو دوباره لِه میکنیم.