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