۳ - ۷چندتا تابع دیگه برای لیست‌ها

از اونجا که ‏‎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

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