۴ - ۸لیست‌ها

یه تایپ دیگه‌ای که برای نگهداریِ چند مقدار توی یک مقدار استفاده میشه، لیست‌ه. ولی لیست‌ها سه تا فرق اساسی با توپل‌ها دارن: اول اینکه همه‌ی المان‌های یه لیست باید از یک تایپ باشن. دوم، لیست‌ها گرامر مخصوص خودشون رو دارن، []؛ مثل گرامر ِتوپل‌ها، هم برای نوع‌سازها در تایپ سیگنچرها استفاده میشه، و هم در سطح جمله‌ای برای بیانِ لیست مقادیر. سوم، تعداد مقادیری که در لیست قرار می‌گیرن، در تایپِ لیست مشخص نمیشه – بر عکسِ توپل که آریتی ِاون در تایپِ‌ش تعیین میشد و تغییرناپذیر بود.

یه مثال در REPL:

Prelude> let p = "Papuchon"
Prelude> let awesome = [p, "curry", ":)"]
Prelude> awesome
["Papuchon","curry",":)"]

Prelude> :t awesome
awesome :: [[Char]]

awesome، یه لیستی از لیست‌های با مقادیرِ Char ِه (یا یه لیستی از String، چون Stringتایپِ مستعار ِ[Char] ِه). پس همه‌ی توابع و عملگرهایی که با لیست‌های هر تایپی (که با [a] نشون داده میشن) کار می‌کنن، با String هم کار می‌کنن چون [Char] حالت خاصی از [a] ِه.

Prelude> let s = "The Simons"
Prelude> let also = ["Quake", s]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
Prelude> awesome ++ also
["Papuchon",
 "curry",
 ":)",
 "Quake",
 "The Simons"]
Prelude> let allAwesome = [awesome, also]
Prelude> allAwesome
[["Papuchon", "curry", ":)"],
 ["Quake", "The Simons"]]
Prelude> :t allAwesome
allAwesome :: [[[Char]]]
Prelude> :t concat
concat :: [[a]] -> [a]
Prelude> concat allAwesome
["Papuchon",
 "curry",
 ":)",
 "Quake",
 "The Simons"]

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