۹ - ۲نوع‌داده‌ی لیست

نوع‌داده ِ لیست در هسکل اینطور تعریف شده:

data [] a = [] | a : [a]

اینجا، ‏‎[]‎‏ هم نوع‌ساز برای لیست‌ها وهم داده‌ساز برای لیستِ خالی‌ه. داده‌ساز ِ ‏‎[]‎‏ یه داده‌ساز ِ پوچگانه هست چون هیچ آرگومانی نمی‌گیره. اما داده‌ساز ِ دوم، آرگومان می‌گیره. ‏‎(:)‎‏ یه عملگر ِ میانوند ِه که معمولاً cons (مخففِ construct به معنای "بساز") خونده میشه. cons یه مقدار با تایپِ ‏‎a‎‏ و یه لیست با تایپِ ‏‎[a]‎‏ می‌گیره که به یه ‏‎[a]‎‏ محاسبه میشه.

همونطور که از اون خط عمودی ‏‎|‎‏ مشخص‌ِه، نوع‌داده ِ لیست در کل یه تایپِ جمع ِه، با این حال، داده‌ساز ِ دومِش ‏‎(:)‎‏ (یا cons) دو آرگومان می‌گیره و در نتیجه، یه ضرب ِه. به یاد بیارین که یه تایپ جمع رو میشه مثل یا خوند، مثل نوع‌داده ِ ‏‎Bool‎‏ که ‏‎True‎‏ یا ‏‎False‎‏ داره. تایپ ضرب هم مثل و می‌مونه. در مورد تایپ‌های جمع و ضرب یه فصل دیگه صحبت می‌کنیم، برای الان فقط کافیه که بدونین ‏‎a : [a]‎‏ با اضافه کردنِ ‏‎a‎‏ به اولِ ‏‎[a]‎‏، با دو آرگومان یک مقدار درست می‌کنه. در نهایت، نوع‌داده ِ لیست یه تایپ جمع ِه، چون یا یه لیست خالی‌ه، یا یه مقدار مجرد به همراه لیست بیشتر – نه هردو.

تعریف نوع‌داده ِ لیست رو اینطور میشه خوند:

data []  a   =   []   |  a : [a]
--  [1] [2]      [3] [4]  [5]

۱.

نوع‌داده با نوع‌ساز ِ ‏‎[]‎‏

۲.

تک آرگومانِ نوع‌ساز (‏‎a‎‏)

۳.

داده‌ساز ِ پوچگانه ِ ‏‎[]‎‏

۴.

نشون دهنده‌ی "یا" برای تایپ جمع

۵.

داده‌ساز ِ ‏‎(:)‎‏ که از ضرب ِ یه مقدار با تایپِ ‏‎a‎‏ که در نوع‌ساز معرفی کردیم، و یه مقدار با تایپِ ‏‎[a]‎‏ که همون "لیست بیشتر" ِه.

cons یا ‏‎(:)‎‏ یه داده‌ساز ِ میانوند ِه که بین دو آرگومانِ ‏‎a‎‏ و ‏‎[a]‎‏ قرار می‌گیره. از اونجا که مثل تایپِ توپل ‏‎(a,b)‎‏ دو آرگومان می‌گیره، حاصلضرب ِاون دو آرگومان میشه. اما برخلافِ توپل، این سازنده بازگشتی ِه، چون تایپِ خودش ‏‎[a]‎‏ به عنوان یکی از اعضای ضرب معرفی شده.

اگه برنامه‌نویسِ با تجربه‌ای هستین یا یه کلاس‌هایی از مهندسیِ کامپیوتر رو گذروندین، احتمالاً با لیست‌های تک‌پیوندی آشنا هستین. لیست‌های هسکل هم تقریباً همونطور کار می‌کنن، البته گاهی اوقات به خاطر محاسبه‌ی نااَکید در هسکل، عملکردِ حالت متوسط متفاوت میشه؛ از طرف دیگه لیست‌های هسکل ممکنه بینهایت داده داشته باشن (که میشه ازشون به عنوان نوع‌داده‌ی جریانی استفاده کرد) که میشه با داده‌ساز ِ ‏‎[]‎‏ جریان ِشون رو پایان داد.