۳ - ۲نگاهی به تایپ‌ها

قبل از کار با نوشته‌ها، می‌خوایم اول بفهمیم این ساختارهای داده در هسکل چی هستن، و کمی با گرامر ِاونها آشنا بشیم. تا اینجا چیز زیادی از تایپ‌ها نگفتیم، ولی فصل قبل چند نمونه ازشون دیدین. از مباحثِ مهمِ هسکل، همین تایپ‌ها هستن، و دو فصلِ بعدی تماماً به این موضوع پرداختن.

به طور کلی، تایپ‌ها راهی برای دسته‌بندیِ مقادیر اند. برای مثال، تایپ‌های زیادی از اعداد وجود دارن، اینکه صحیح باشن یا کسری یا انواع دیگه. یه تایپ هم برای مقادیرِ بولییَن، ‏‎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‎‏ است.