۶ - ۱۵تعاریف
۱.
وراثت تایپکلاس یا typeclass inheretence وقتی پیش میاد که یه تایپکلاس دارای سوپرکلاس باشه. به کلام دیگه، یعنی برای نوشتنِ یه نمونه از یه تایپکلاس، تایپی که براش میخواین نمونه بنویسین، ملزم به داشتنِ نمونه از یه تایپکلاسِ دیگهست.
class (Num a) => Fractional a where
(/) :: a -> a -> a
recip :: a -> a
fromRational :: Rational -> aاینجا تایپکلاسِ Fractional از Num ارث میبره. به عبارت دیگه Num یه سوپرکلاس برای Fractional ِه. یعنی اگه برای یه تایپ a بخواین نمونه ِ تایپکلاس Fractional بنویسین، اون تایپ a باید یه نمونه از Num داشته باشه.
-- شاید به نظر برسه که کار میکنه
-- Nada اما خطا میده، چون
-- نداره Num تایپکلاسِ
newtype Nada =
Nada Double deriving (Eq, Show)
instance Fractional Nada where
(Nada x) / (Nada y) = Nada (x / y)
recip (Nada n) = Nada (recip n)
fromRational r = Nada (fromRational n)اگه این رو بارگذاری کنین:
No instance for (Num Nada)
arising from the superclasses
of an instance declaration
In the instance declaration for
‘Fractional Nada’باید یه نمونه از Num داشته باشه. نمیشه براش نمونه ِ Num نوشت؟ پس حق ندارین نمونه ِ Fractional هم داشته باشین. اینجوریاس!
۲.
اثرات یا effects کارهای قابل مشاهدهای هستن که یه برنامه علاوه بر محاسبهی مقادیر، ممکنه انجام بده. اگه تابعی یه حالت رو تغییر بده، یا با دنیای بیرون طوری تعامل کنه که بشه مشاهده کرد، میگیم اون تابع روی دنیای بیرونی اثر میذاره.
۳.
تایپِ IO برای مقادیری به کار میره که محاسبهشون احتمال داره منجر به عوارض جانبی بشه، مثل چاپ نوشته، خوندن نوشته ِ ورودی توسط کاربر، خوندن یا نوشتن فایلها، یا اتصال به کامپیوترهای دیگه. تو فصلِ مربوط به IO خیلی عمیقتر بررسی میکنیم.
۴.
یک نمونه یا instance طرز کار یه تایپکلاس رو برای یه تایپ تعریف میکنه. نمونهها به ازای یک تایپکلاس و یک تایپ، یکتا هستن.
۵.
در هسکل، نمونههای مشتقگرفته یا derived instances نمونههای تایپکلاسهایی هستن که تعریفشون واضح یا رایجه. مثلاً نمونه ِ تایپکلاسهای Eq، Enum، Ord، و Show رو میشه برای نوعدادههای زیادی، فقط بر اساس تعریفشون ایجاد کرد. این به برنامهنویسها کمک میکنه یه کُد رو دائماً تکرار نکنند.