۳ - ۲نگاهی به تایپها
قبل از کار با نوشتهها، میخوایم اول بفهمیم این ساختارهای داده در هسکل چی هستن، و کمی با گرامر ِاونها آشنا بشیم. تا اینجا چیز زیادی از تایپها نگفتیم، ولی فصل قبل چند نمونه ازشون دیدین. از مباحثِ مهمِ هسکل، همین تایپها هستن، و دو فصلِ بعدی تماماً به این موضوع پرداختن.
به طور کلی، تایپها راهی برای دستهبندیِ مقادیر اند. برای مثال، تایپهای زیادی از اعداد وجود دارن، اینکه صحیح باشن یا کسری یا انواع دیگه. یه تایپ هم برای مقادیرِ بولییَن، True یا False، وجود داره. تایپهایی که ما تو این فصل باهاشون کار داریم، Char یا "حرف"ها، و String اند.
در GHCi میشه تایپِ مقادیر، بیانیهها و یا توابع رو با دستورِ :type پیدا کرد.
REPL رو باز کنین و توی prompt ِش تایپ کنین: :type 'a'. چنین پیغامی میاد:
Prelude> :type 'a'
'a' :: Charبه چندتا چیز توجه کنیم. اول اینکه حرف رو بین دو تا آپاستروف گذاشتیم، که مشخص میکنن منظور ما یه متغیر نبوده. اگه بدون آپاستروف بنویسین، :type a، GHCi خطا میده که a در گستره نیست. یعنی متغیرِ a تعریف نشده، پس GHCi نمیتونه تایپش رو بگه.
دوم، همونطور که قبلاً هم گفتیم، علامتِ :: اینطور خونده میشه: دارای تایپِ ... است. کلاً توی هسکل زیاد دیده میشه. هر وقت دو تا دونقطه دیدین، میدونین جلوش یه تایپ سیگنچر نوشته شده. تایپ سیگنچر یک خط کُده که تایپهای یک مقدار، بیانیه، یا تابع رو تعریف میکنه.
مورد آخر هم، تایپِ Char ِه. Char، تایپیه که شامل حروف و اعداد، کاراکترهای یونیکُد، علائم و غیرهست. پس وقتی تو GHCi مینویسیم :type 'a'، در واقع میپرسیم تایپِ a چیه؟ و جواب GHCi، 'a' :: Char، یعنی a دارای تایپِ Char است.
حالا یه نوشته رو امتحان کنیم. این بار باید از علامتِ نقل قول استفاده کنیم، تا GHCi متوجه بشه که ما یه رشته از حروف داریم، نه یه دونه حرف:
Prelude> :type "Hello!"
"Hello!" :: [Char]اون کروشه ها اطراف Char، شکرِ گرامری برای لیستاند. String، تایپِ مستعار یا تایپِ مترادف، برای لیستِ Charهاست. تعریفِ تایپِ مستعار از اسمش پیداست: یه استعاره یا مترادف از یه تایپِ دیگهست، که معمولاً برای سادگی تعریف میشه، ولی در باطن، همون تایپِ اصلیه. String هم یه اسم دیگه برای لیستِ Char ِه. String ظاهرِ کاملاً متفاوتی نسبت به لیستِ بقیهی تایپها داره، که گاهی اوقات کاربردیه. وقتی لیستها رو بیشتر توضیح بدیم، دلیلِ شکر گرامری بودنِ اون کروشه ها رو هم میفهمیم؛ ولی تا اینجا کافیه بدونیم که "Hello!" دارای تایپ لیستِ Char است.