۴ - ۸لیستها
یه تایپ دیگهای که برای نگهداریِ چند مقدار توی یک مقدار استفاده میشه، لیسته. ولی لیستها سه تا فرق اساسی با توپلها دارن: اول اینکه همهی المانهای یه لیست باید از یک تایپ باشن. دوم، لیستها گرامر مخصوص خودشون رو دارن، []
؛ مثل گرامر ِتوپلها، هم برای نوعسازها در تایپ سیگنچرها استفاده میشه، و هم در سطح جملهای برای بیانِ لیست مقادیر. سوم، تعداد مقادیری که در لیست قرار میگیرن، در تایپِ لیست مشخص نمیشه – بر عکسِ توپل که آریتی ِاون در تایپِش تعیین میشد و تغییرناپذیر بود.
یه مثال در 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"]
توضیحاتِ کامل لیستها رو برای فصلش نگه میداریم. لیستها پیچیدگیهای جالبی دارن و ما هم به کمک اونها، مثالهایی از محاسبهی نااَکید ِهسکل رو نشون میدیم. از طرف دیگه، توابع و ساختارهای استانداردِ خیلی زیادی هستن که با لیستها کار میکنن؛ به همین خاطر یه فصلِ کامل رو به لیستها اختصاص دادیم.