عملیات پایهای لیست را پیادهسازی کنید.
در زبانهای تابعی، عملیات لیست مانند length، map و reduce بسیار رایجاند. مجموعهای از عملیات پایهای لیست را بدون استفاده از توابع موجود پیادهسازی کنید.
تعداد و نام دقیق عملیاتی که باید پیادهسازی شوند بسته به track است تا با نامهای موجود تداخل نکنند، اما عملیات کلی که پیادهسازی میکنید عبارتاند از:
append (با گرفتن دو لیست، همهی عناصر لیست دوم را به انتهای لیست اول اضافه میکند)؛concatenate (با گرفتن چندین لیست، همهی عناصر همهی لیستها را در یک لیست مسطح ترکیب میکند)؛filter (با گرفتن یک «محمول» و یک لیست، لیست همهی عناصری را برمیگرداند که predicate(item) برایشان «درست» است)؛length (با گرفتن یک لیست، تعداد کل عناصر آن را برمیگرداند)؛map (با گرفتن یک تابع و یک لیست، لیست نتایج اعمال function(item) روی همهی عناصر را برمیگرداند)؛foldl (با گرفتن یک تابع، یک لیست و «انباشتگر» اولیه، هر عنصر را از سمت چپ در انباشتگر تا میکند (کاهش میدهد))؛foldr (با گرفتن یک تابع، یک لیست و «انباشتگر» اولیه، هر عنصر را از سمت راست در انباشتگر تا میکند (کاهش میدهد))؛reverse (با گرفتن یک لیست، لیستی برمیگرداند که همهی عناصر اصلی را دارد، اما با ترتیب معکوس).توجه کنید که ترتیبی که آرگومانها به توابع تا (foldl، foldr) داده میشوند اهمیت دارد.
پیادهسازی این عملیات فهرست بدون استفاده از هیچ تابع توکاری در Roc عملاً غیرممکن است، چون باید راهی داشته باشید که با آن عناصر را به انتهای یک فهرست یا ابتدای آن اضافه کنید.
در زبانهای دیگر ممکن است از عملگرهایی مانند : در Haskell یا += در Python استفاده کنید، اما در Roc باید از توابع List استفاده کنید.
پس برای این تمرین اجازه دارید از List.append استفاده کنید (اما از به کار بردن هر تابع توکار دیگری خودداری کنید).
بسیاری از زبانهای برنامهنویسی تابعی از «فهرستهای پیوندی» به عنوان نوع مجموعهی اصلی استفاده میکنند.
افزودن یک عنصر به ابتدای یک فهرست پیوندی یا برداشتن اولین عنصر از آن کارآمد است، بنابراین در آن زبانها عملیات فهرست را با List.prepend پیادهسازی میکنید.
اما در Roc، یک List یک «آرایه» است (تکهای پیوسته از بایتها).
آرایهها ویژگیهایی متفاوت از فهرستهای پیوندی دارند، مانند توانایی دسترسی کارآمد به عناصر از طریق اندیس و افزودن عناصر جدید.
به همین دلیل، در Roc اغلب از List.append استفاده میکنیم و به ندرت از List.prepend استفاده میکنیم.
Roc از اسمهایی استفاده میکند که کمی با اسمهای آمده در دستورالعملهای کلی تفاوت دارند:
concat به جای append
join به جای concatenate
len به جای length
fold به جای foldl
fold_rev به جای foldr
با این حال، اسمهای توابع زیر در Roc استاندارد هستند:
filtermapreverseاین را امتحان کنید:
match list {
[] => ...
[first, .. as rest] => ...
}
یا
match list {
[] => ...
[.. as rest, last] => ...
}
در Exercism ثبتنام کنید تا Roc را همراه با 126 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.
از مقدمهای عملی بر بازگشت لذت ببرید، جایگزینهای دستوری و تابعی «عملیات لیست» را بررسی کنید و به بازگشت دنبالهای و توابع انباره عمیق شوید.