۳ - ۷چندتا تابع دیگه برای لیستها
از اونجا که String
یه حالت خاص از لیستهاست، امکانِ اعمالِ بقیهی عملگرهای لیست هم روی اون وجود داره.
در زیر چندتا از این توابع رو مثال زدیم:
Prelude> :t 'c'
'c' :: Char
Prelude> :t "c"
"c" :: [Char]
-- ه. String همون [Char]
اوپراتورِ (:)
، که cons (م. کانز) خونده میشه، برای ساختن ِ لیست به کار میره:
Prelude> 'c' : "hris"
"chris"
Prelude> 'P' : ""
"P"
تابعِ بعدی، head
، سَر یا اولین الِمان یه لیست رو برمیگردونه:
Prelude> head "Papuchon"
'P'
مکملِ اون تابع، تابعِ tail
، لیست رو بدونِ اولین المان پس میده (سر بریده!):
Prelude> tail "Papuchon"
"apuchon"
take
برای گرفتنِ تعداد مشخصی از المانهای لیست به کار میره (از سمت چپ):
Prelude> take 1 "Papuchon"
"P"
Prelude> take 0 "Papuchon"
""
Prelude> take 6 "Papuchon"
"Papuch"
تابعِ drop
هم بعد از حذفِ تعداد المانهای تعیین شده، باقیماندهی لیست رو برمیگردونه:
Prelude> drop 4 "Papuchon"
"chon"
Prelude> drop 9001 "Papuchon"
""
Prelude> drop 1 "Papuchon"
"apuchon"
عملگر ِ (++)
رو هم قبلاً دیدیم:
Prelude> "Papu" ++ "chon"
"Papuchon"
Prelude> "Papu" ++ ""
"Papu"
عملگر ِ میانوند ِ (!!)
برای گرفتنِ n اُمین المانِ لیسته، که n اندیس ِ المان، و از صفر شروع میشه. یعنی برای این تابع، اولین المان اندیس ِ صفر داره، و نه یک.
Prelude> "Papuchon" !! 0
'P'
Prelude> "Papuchon" !! 4
'c'
همهی این توابعِ استاندارد، جزئی از Prelude
هستن، با این حال خیلیهاشون نااَمن تلقی میشن. دلیلش هم پشتیبانی نکردن یکی از حالتهای ورودی، یعنی لیستِ خالیه. اگه آرگومانِ اکثر این توابع یه لیست خالی باشه، پیغام خطا، یا استثنا میدن:
Prelude> head ""
*** Exception: Prelude.head: empty list
Prelude> "" !! 4
*** Exception: Prelude.!!: index too large
چنین رفتاری از یه تابع اصلاً ایدهآل نیست، و به همین دلیل استفاده از این توابع در برنامههای اساسی خیلی عاقلانه به حساب نمیاد، ولی ما ازشون تو این چندتا فصلِ اول استفاده میکنیم. در یکی از فصلهای آینده، توضیح میدیم که چطور همهی حالتهای ورودی برای توابع رو از پیش در نظر بگیریم، و نسخهی امن ِ این توابع رو بنویسیم.